假设我有一个std::list myList
和一个迭代器myIt
,我用来指向列表中的某个元素。
现在我制作一份copiedList
myList
的浅拷贝(所以我可以重新排序)。同样地,我可以复制copiedIt
myIt
,但它仍然引用myList
而不是copiedList
,这意味着我无法将其与copiedList.end()
进行明智的比较,因为我可能已修改该列表。
是否有(标准)重新安装 copiedIt
的方式来引用copiedList
?只要我没有对副本进行任何更改,这应该在语义上有效。
我目前的解决方案是使用原始迭代器来std::find
列表副本中的指向元素,但是虽然这样做并且没有问题,但它似乎没有问题。
答案 0 :(得分:3)
您可以使用std::next
和std::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
的距离,并将迭代器带到新容器中相同的远处元素。
这可以很容易地推广到允许source
和target
具有不同类型。稍微多做一些工作,也可以对常量迭代器进行泛化。
答案 1 :(得分:0)
如何复制列表?如果您迭代第一个列表并继续单独插入项目,则每个步骤都会获得迭代器:http://www.cplusplus.com/reference/list/list/insert/
这是因为list::insert
返回一个指向第一个新插入元素的迭代器。