假设我有一个 std::list myList
和一个迭代器 myIt
,我用它来指向列表中的某个元素。
现在我对myList
做了一个copiedList
的浅拷贝(所以我可以重新排序)。同样,我可以复制 myIt
的 copiedIt
,但是它仍然引用 myList
而不是 copiedList
,这意味着我不能明智地将它与 copiedList.end()
进行比较,因为我可能已经修改了该列表。
是否有(标准)方法重新设置 copiedIt
以引用copiedList
?只要我没有对拷贝进行任何更改,这在语义上应该是有效的。
我目前的解决方案是使用原始迭代器来 std::find
列表拷贝中指向的元素,但是虽然这有效并且不会导致任何问题,但它似乎不够优雅。
最佳答案
您可以使用 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
具有不同的类型。通过稍多一些工作,也可以泛化为常量迭代器。
关于c++ - 将容器重置为迭代器 "points",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44066793/