我想知道两个迭代器是否共享相同的可迭代。像这里:
typedef std::list<int> IntList;
IntList l;
IntList j;
// fill the lists
IntList::iterator start = l.begin();
IntList::iterator end = j.end();
std::cout << std::distance(start, end) << std::endl;
这段代码不起作用,对我来说很明显为什么它不会:跟踪一个迭代器直到它到达另一个迭代器并计算步数。
但对我来说,最好找出两个迭代器是否指向同一个迭代。用例是我有列表和切片,而切片的开头和结尾指向列表中的某个位置。我想知道的是两个切片是否共享同一个列表。解决方法是为我的切片提供指向列表的指针,当然,然后简单地比较这些指针。但知道是否有另一种方式很有趣。
答案 0 :(得分:1)
This question讨论了类似的问题。
简而言之,比较不起作用,因为C ++ 03标准在比较来自不同容器的迭代器方面并不十分清楚,而在C ++ 11中它是明确禁止的。
适用于标准容器的可能解决方案是比较所包含元素的地址。
答案 1 :(得分:1)
C ++迭代器设计得非常轻量级,因此它们通常不包含指向其容器的指针。相反,我们设计算法来获取调用者保证指向同一容器的迭代器范围,例如std::unique
或boost::sort
,或者我们将容器及其迭代器一起传递,如{{1} },再次依赖调用者来跟踪哪些迭代器指向哪些容器。