复制列表和关联的迭代器

时间:2014-11-30 23:25:39

标签: c++ list iterator

假设我有一个迭代的列表。当我发现一些有趣的东西时,我想要复制并在那一点上做点什么:

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,该迭代器引用bi引用的a中相同的位置?

1 个答案:

答案 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),因为它只是在指责几个指针。即使对象移动到不同的列表,也保证拼接保留迭代器。