将容器重新设置为迭代器 "points"

Reseat the container an iterator "points" to

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

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

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

我目前的解决方案是使用原始迭代器 std::find 列表副本中指向的元素,但是虽然这有效并且不会导致任何问题,但它似乎不够优雅。

您可以使用 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 属于不同的类型。稍微多做一些工作,也可以泛化为常量迭代器。

如何复制列表?如果你迭代第一个列表并继续单独插入项目,你将在每一步得到迭代器:http://www.cplusplus.com/reference/list/list/insert/

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