2011-12-16 118 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,再次依靠調用者來跟蹤哪些迭代器指向哪個容器。