在下面的示例代码中,在给示例列表分配了编号之后,我尝试与之复制容器,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());
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句