C++ 根据条件将元素从一个转发列表转移到另一个转发列表

C++ 根据条件将元素从一个转发列表转移到另一个转发列表,c++,c++11,forward-list,C++,C++11,Forward List,我有两个正向列表:list1和list2。我想迭代第一个元素,并根据条件将元素转移到第二个元素。下面是一个使用forward\u list的示例,它不起作用,但我认为它表达了我想要的内容 #include <iostream> #include <forward_list> using namespace std; int main(void) { forward_list<int> list1 = {1, 2, 3, 4, 5, 6};

我有两个正向列表:
list1
list2
。我想迭代第一个元素,并根据条件将元素转移到第二个元素。下面是一个使用
forward\u list
的示例,它不起作用,但我认为它表达了我想要的内容

#include <iostream>
#include <forward_list>

using namespace std;

int main(void)
{
    forward_list<int> list1 = {1, 2, 3, 4, 5, 6};
    forward_list<int> list2;

    //Transfer elements between 2 and 5 from list1 to list2.    
    forward_list<int>::const_iterator iter_before = list1.before_begin();
    forward_list<int>::const_iterator iter = list1.begin();
    while ( iter != list1.end())
    {
        int item = *iter;
        cout << item ;
        if (2 <= item && item <= 5 )
        {
            list2.splice_after(list2.before_begin(),list1,iter_before);
            iter_before = iter;
            iter++;
            cout << "! "; // Indicates if current item is transferred.
        }
        else
        {
            iter++;
            iter_before++;
            cout << " ";
        }
    }

    cout << "\nList 1: ";
    for (auto item : list1)
    {
        cout << item << " ";
    }
    cout << "\nList 2: ";
    for (auto item : list2)
    {
        cout << item << " ";
    }
    cout << endl;

    return 0;
}
#包括
#包括
使用名称空间std;
内部主(空)
{
前向列表列表1={1,2,3,4,5,6};
转发列表2;
//将2和5之间的元素从列表1传输到列表2。
forward_list::const_迭代器iter_before=list1.before_begin();
转发列表::常量迭代器iter=list1.begin();
while(iter!=list1.end())
{
国际热核实验堆;

你的答案能否准确地描述STL
copy_if
()的用例。

诀窍在于认识到:

  • 您需要获得一个迭代器,该迭代器指向要拼接到另一个列表中的元素,并且必须在拼接之前进行。拼接之后,该迭代器将指向要处理的下一个元素
  • 拼接后,
    iter\u before
    仍然指向下一个待处理元素的正前方-无需更改它
  • 因此,在您的
    if
    中,请改为:

    auto iter_next = std::next(iter);
    list2.splice_after(list2.before_begin(),list1,iter_before);
    iter = iter_next;
    

    .

    我有我在文章末尾尝试过的方法。我认为主要问题是使用
    splice\u after()后指向
    list1
    的迭代器重新映射到
    list2
    的方式
    。谢谢您的回答!但是如果
    不能完全满足我的需要,请复制。\n我希望
    list1
    在传输完成后不包含元素。