将容器重新安装一个迭代器"点"至

时间:2017-05-19 09:50:18

标签: c++ iterator listiterator

假设我有一个std::list myList和一个迭代器myIt,我用来指向列表中的某个元素。

现在我制作一份copiedList myList的浅拷贝(所以我可以重新排序)。同样地,我可以复制copiedIt myIt,但它仍然引用myList而不是copiedList,这意味着我无法将其与copiedList.end()进行明智的比较,因为我可能已修改该列表。

是否有(标准)重新安装 copiedIt的方式来引用copiedList?只要我没有对副本进行任何更改,这应该在语义上有效。

我目前的解决方案是使用原始迭代器来std::find列表副本中的指向元素,但是虽然这样做并且没有问题,但它似乎没有问题。

2 个答案:

答案 0 :(得分:3)

您可以使用std::nextstd::distance,如下所示:

template <class Container>
typename Container::iterator reseat(typename Container::iterator it, const Container &source, Container &target)
{
  return std::next(target.begin(), std::distance(source.begin(), it));
}

在散文中:从容器的开头找到it的距离,并将迭代器带到新容器中相同的远处元素。

这可以很容易地推广到允许sourcetarget具有不同类型。稍微多做一些工作,也可以对常量迭代器进行泛化。

答案 1 :(得分:0)

如何复制列表?如果您迭代第一个列表并继续单独插入项目,则每个步骤都会获得迭代器:http://www.cplusplus.com/reference/list/list/insert/

这是因为list::insert返回一个指向第一个新插入元素的迭代器。