共享迭代器相同的迭代?

时间:2011-12-16 07:49:16

标签: c++ iterator

我想知道两个迭代器是否共享相同的可迭代。像这里:

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;

这段代码不起作用,对我来说很明显为什么它不会:跟踪一个迭代器直到它到达另一个迭代器并计算步数。

但对我来说,最好找出两个迭代器是否指向同一个迭代。用例是我有列表和切片,而切片的开头和结尾指向列表中的某个位置。我想知道的是两个切片是否共享同一个列表。解决方法是为我的切片提供指向列表的指针,当然,然后简单地比较这些指针。但知道是否有另一种方式很有趣。

2 个答案:

答案 0 :(得分:1)

This question讨论了类似的问题。

简而言之,比较不起作用,因为C ++ 03标准在比较来自不同容器的迭代器方面并不十分清楚,而在C ++ 11中它是明确禁止的。

适用于标准容器的可能解决方案是比较所包含元素的地址。

答案 1 :(得分:1)

C ++迭代器设计得非常轻量级,因此它们通常不包含指向其容器的指针。相反,我们设计算法来获取调用者保证指向同一容器的迭代器范围,例如std::uniqueboost::sort,或者我们将容器及其迭代器一起传递,如{{1} },再次依赖调用者来跟踪哪些迭代器指向哪些容器。