gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:31:59 25 4
gpt4 key购买 nike

我有两个转发列表: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 上的元素,这也有效。我认为这两种解决方案都是低效的。

谁能提出一个更有效的方法,只涉及交换列表中的指针?

最佳答案

诀窍是意识到:

  1. 您需要获得一个迭代器,指向您将拼接到另一个列表中的元素之后的元素 - 这必须在拼接之前进行。拼接后,这个迭代器将指向下一个要处理的元素。
  2. 拼接后,iter_before 仍指向下一个要处理的元素之前 - 无需更改。

因此,在您的 if 中,改为:

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

Demo .

关于c++ - 根据条件将元素从一个 forward_list 转移到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28755390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com