将容器重新设置为迭代器 "points"
Reseat the container an iterator "points" to
假设我有一个 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
属于不同的类型。稍微多做一些工作,也可以泛化为常量迭代器。
如何复制列表?如果你迭代第一个列表并继续单独插入项目,你将在每一步得到迭代器:http://www.cplusplus.com/reference/list/list/insert/
这是因为 list::insert
returns 一个指向第一个新插入元素的迭代器。
假设我有一个 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
属于不同的类型。稍微多做一些工作,也可以泛化为常量迭代器。
如何复制列表?如果你迭代第一个列表并继续单独插入项目,你将在每一步得到迭代器:http://www.cplusplus.com/reference/list/list/insert/
这是因为 list::insert
returns 一个指向第一个新插入元素的迭代器。