假设我有一个迭代的列表。当我发现一些有趣的东西时,我想要复制并在那一点上做点什么:
std::list<int> a;
for(auto i = a.begin(); i != a.end(); ++i)
{
if(is_interesting(*i))
{
std::list<int> b = a; // take a copy
do_something(b, i); // :(
}
}
当然这不会起作用,因为迭代器i
指的是a
而不是b
。如何获得一个迭代器j
,该迭代器引用b
中i
引用的a
中相同的位置?
答案 0 :(得分:1)
这是一种方式:
std::list<int> b = a;
std::list<int>::iterator j = b.begin();
std::advance(j, std::distance(a.begin(), i));
您可以通过使用循环条件递增计数器来优化此操作,而不是重新计算偏移量。当然,distance
的{{1}}和advance
函数遍历列表。
正如评论中所述,需要执行此操作表明您的代码可能有更好的高级设计可能性。在不知道为什么需要复制列表的情况下,您可能只需复制其中的一部分,例如
list
如果你确实需要整个列表,那么这里有一个选项(不确定它是否比第一个选项更复杂!):
std::list<int> b2( i, a.end() );
当然,std::list<int> b( a.begin(), i );
std::list<int> b2( i, a.end() );
std::list<int>::iterator j = b2.begin();
b.splice( b.end(), b2 ); // moves all of b2's elements into b
的拼接是O(1),因为它只是在指责几个指针。即使对象移动到不同的列表,也保证拼接保留迭代器。