一个多小时以来,我一直在努力解决这个问题。我需要将一个整数从列表的中间移到开头。没有移动整数的选项,如果我可以在开头插入一个并从中间删除旧的,那会很好,但你也不能这样做。 (您可以删除特定整数的每个条目,而不是单个)
我在 cplusplus.com 上阅读了所有关于 std::forward_list 的内容,并用谷歌搜索了 15 分钟,没有结果。
最佳答案
结合这三点来删除 forward_list 中的给定元素(给定位置):
使用 erase_after 删除 a 位置之后的一个(或范围)。
使用两个迭代器,prev 和it,其中prev保持前一个位置,it保持实际位置。
使用before_begin 初始化prev 并使用begin 初始化它。如果第一个位置匹配,这对于能够删除元素非常重要。
std::forward_list<int> mylist = {10, 10, 20, 30, 40, 10, 50, 10, 60}; int skey = 10; for (int & val : mylist) std::cout<<val<<", "; auto prev = mylist.before_begin(); for (auto it = mylist.begin(); it!=mylist.end(); ++it) { if(*it==skey) // or if(it== input_it_pos) for a known position { mylist.erase_after(prev); break; } prev=it; } std::cout<<"\n after deletion : "<<std::endl; for (int & val : mylist) std::cout<<val<<", ";
注意1:您可以通过以下方式更改代码以删除所有匹配的元素:
auto prev = mylist.before_begin();
for (auto it = mylist.begin(); it!=mylist.end(); )
{
if(*it==skey)
{
it = mylist.erase_after(prev);
// break; // Comment or uncomment to deal with only the first or all the found element(s).
}
else
{
prev = it;
++it;
}
}
注意2:如果不使用before_begin,两个prev和it从同一个点开始:(forward_list.begin()) ,可以单独检查第一个元素,然后使用 pop_front 删除它。
您可以使用 remove、remove_if 从您的 forward_list 中删除所有元素(remove:比较等于 val,remove_if:which Predicate pred 返回 true)。
关于c++ - 如何移动或删除 std::forward_list 中的特定元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47625749/