我有两个forward_lists:list1
和list2
。我想迭代第一个并根据条件将元素传递给第二个元素。以下是使用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;
}
我已尝试将iter
和iter_before
迭代器重置为list1
的开头,但有效但不止一次地横穿某些list1
个元素(重新启动) 。我还尝试先将元素复制到list2
,然后删除list1
上的元素,这也有效。我认为这两种解决方案效率低下。
任何人都可以提出一个更有效的方法,只需交换列表中的指针吗?
答案 0 :(得分:2)
诀窍是意识到:
iter_before
仍然指向要处理的下一个元素之前 - 无需更改它。因此,在您的if
中,请改为:
auto iter_next = std::next(iter);
list2.splice_after(list2.before_begin(),list1,iter_before);
iter = iter_next;
答案 1 :(得分:0)
您的答案准确描述了STL copy_if
(http://www.cplusplus.com/reference/algorithm/copy_if/)的使用案例。