2011-12-16 133 views
1

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

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; 

这段代码不工作,对我来说它为什么不很清透:有没有可能跟随一个迭代器,直到它到达其他和计数的步骤。

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

+1

发现两个切片是否共享相同列表的用例是什么? – 2011-12-16 08:01:57

+0

@JeffreyYasskin,我想合并连续的切片。我可以测试片的开始和结束是相同的,但我想实现一个更智能的算法。 – 2011-12-16 08:06:41

回答

1

This question讨论了类似的问题。

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

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

1

C++迭代器被设计为非常轻量级,因此它们通常不包含指向其容器的指针。相反,我们要么设计算法来将调用者保证指向迭代器的范围放在同一个容器中,如std::uniqueboost::sort,要么我们将容器及其迭代器同时传递到一起,如std::vector::erase,再次依靠调用者来跟踪哪些迭代器指向哪个容器。