2011-07-22 50 views

回答

2

不可能。您可能需要步行至end,爲此您需要知道list的來源,這不是list::iterator中的編碼。

(儘管如此,您可以爲此創建一個函數對象,它將list或origin作爲構造函數參數。請注意,查明一個迭代器是否少於另一個會花費O(n)次)。

2

你不能這樣做,因爲你必須知道列表的開始和/或結束,才能做出這樣的比較。只有隨機訪問迭代器定義operator<

7

你不能直接做,但你可以計算std::distance(x.begin(), it1)std::distance(x.begin(), it2)並比較這些。鑑於列表沒有隨機訪問,您希望必須通過遍歷整個列表來支付這樣的查詢的代價。


編輯:如果兩個迭代器都靠近列表的末尾,這將表現不佳。如果你想獲得更看中的,你可以寫一些探索性的算法,從兩個迭代器向外移動:

[ .... <-- it1 --> .... <-- it2 --> .... ] 

你會基本保持兩個副本的每個,fwd1/rev1fwd2/rev2,你遞減rev*迭代器,直到您點擊x.begin()並提前迭代器fwd*,直到您點擊x.end()。如果你的迭代器對是均勻分佈的,這可能會有更好的預期運行時間。

1

假設++(list.end())不是未定義的行爲,等於list.end(),有一種方法。但我不確定這個假設。

如果它是有效的,你可以定義一個簡單的算法來獲得你想要的結果。

+1

不幸的是,這確實是未定義的行爲。它確實發生在至少一個主要實現上,但這是您得到的最佳保證。 –