c++ - 如何移动或删除 std::forward_list 中的特定元素?

标签 c++ forward-list

一个多小时以来,我一直在努力解决这个问题。我需要将一个整数从列表的中间移到开头。没有移动整数的选项,如果我可以在开头插入一个并从中间删除旧的,那会很好,但你也不能这样做。 (您可以删除特定整数的每个条目,而不是单个)

我在 cplusplus.com 上阅读了所有关于 std::forward_list 的内容,并用谷歌搜索了 15 分钟,没有结果。

最佳答案

结合这三点来删除 forward_list 中的给定元素(给定位置):

  • 使用 erase_after 删除 a 位置之后的一个(或范围)。

  • 使用两个迭代器,previt,其中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/

相关文章:

c++ - 了解声明中模板参数的数量

c++ - 应用程序中有很多线程会适得其反吗?

c++ - 使用 2 种方法提取容器中的数据( pop_front 和 front )

c++ - std::list::splice() 和 std::forward_list::splice_after() 在 C++11 中声明为 noexcept 吗?

c++ - std::forward_list 和 std::forward_list::push_back

C++ 指针 - 冲突声明和指针到指针

java - 通过套接字发送 10 MB 的缓冲区 - block 还是整个 10MB?

c++ - 为什么将 forward_list 与 char 一起使用比将它与 long long 一起使用更优化?

c++ - 为什么要为 std::forward_list 拼接整个列表或线性范围?

c++ - 泛型类型初始化中的歧义