c++ - 将容器重置为迭代器 "points"

标签 c++ iterator listiterator

假设我有一个 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 具有不同的类型。通过稍多一些工作,也可以泛化为常量迭代器。

关于c++ - 将容器重置为迭代器 "points",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44066793/

相关文章:

java - ListIterator 在开始/结束时有不同的行为

c++ - QML TableView + PostgreSQL 数据库报错

c++ - 将链表转换为二叉搜索树,执行操作并将树作为列表返回

c++ - 以下代码是否使用 std::set "legal"?

c++ - 如何在 map 的前 3 个值上使用 std::accumulate

java - 列表迭代器方法的正确实现

c++ - 判断一个数字是否是回车数字

c++ - localtime() 和 gmtime() 似乎弄乱了我的输入流 C++/C

C++ 2D 矩阵迭代器与嵌套 for 循环的效率比较

list - 为什么带有步骤的reverse()列表迭代不能正常工作?