根据条件将元素从一个forward_list转移到另一个forward_list

时间:2015-02-27 00:23:00

标签: c++ c++11 forward-list

我有两个forward_lists:list1list2。我想迭代第一个并根据条件将元素传递给第二个元素。以下是使用forward_list<int>的示例,该示例不起作用,但我认为表达了我想要的内容。

#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;
}

我已尝试将iteriter_before迭代器重置为list1的开头,但有效但不止一次地横穿某些list1个元素(重新启动) 。我还尝试先将元素复制到list2,然后删除list1上的元素,这也有效。我认为这两种解决方案效率低下。

任何人都可以提出一个更有效的方法,只需交换列表中的指针吗?

2 个答案:

答案 0 :(得分:2)

诀窍是意识到:

  1. 您需要获取元素的迭代器,该元素将在拼接到另一个列表的元素之后 - 这必须在拼接之前进行。在拼接之后,这个迭代器将指向要处理的下一个元素。
  2. 拼接后,iter_before仍然指向要处理的下一个元素之前 - 无需更改它。
  3. 因此,在您的if中,请改为:

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

    Demo

答案 1 :(得分:0)

您的答案准确描述了STL copy_ifhttp://www.cplusplus.com/reference/algorithm/copy_if/)的使用案例。