gpt4 book ai didi

c++ - 使用 std::copy 复制 std::list 并使用 std::list::erase 删除

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:58:56 25 4
gpt4 key购买 nike

在为示例列表分配数字后的波纹管示例代码中,我试图用 std::copy 复制容器,但问题是在运行时它说 “无法取消引用结束列表迭代器” .

我的问题是如何复制列表以便将复制的范围插入到列表的末尾?

到最后因为我以后需要能够删除重复的范围,这就是我将新范围的开头保存到迭代器的原因。

#include <iostream>
#include <list>
#include <algorithm>

void print(std::list<int>& ref)
{
for (auto& num : ref)
{
std::cout << num << std::endl;
}
}

int main()
{
std::list<int> mylist{ 1, 2, 3, 4 };
std::list<int>::iterator iter = mylist.end();

std::cout << "INITIAL LIST NUMBERS" << std::endl;
print(mylist);

// duplicate list, will cause runtime error
iter = std::copy(mylist.begin(), mylist.end(), --mylist.end());

std::cout << "COPIED LIST IS NOW CONTAINS DUPLICATE NUMBERS" << std::endl;
print(mylist);

// remove previsous duplication
mylist.erase(iter, mylist.end());

std::cout << "AFTER REMOVAL OF COPIED LIST SHOULD BE SAME AS INITIAL LIST" << std::endl;
print(mylist);

std::cin.get();
return 0;
}

最佳答案

您可以使用 std::copy_n .这规避了 std::copy 的问题,当输入 std::back_inserter(mylist) 和始终有效的 时,它会执行无限循环的插入mylist.end() 迭代器。

const std::size_t n = mylist.size();
std::copy_n(mylist.cbegin(), n, std::back_inserter(mylist));

然后去重工作

mylist.erase(std::next(mylist.begin(), n), mylist.end());

关于c++ - 使用 std::copy 复制 std::list 并使用 std::list::erase 删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55468338/

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