2010-02-10 98 views
2

好日子,STL中迭代器和容器之間的關係

假設我正在用C++編寫一個類似Python的範圍。它提供了隨機存取容器的所有特性(當然是不可變的)。我在腦海中提出了一個關於以下情況的問題:

我有兩個不同的迭代器,指向不同的範圍容器的實例。問題是這兩個範圍是等於。即它們表示相同的範圍。你會允許以下情況:

fact: range1 == range2 e.g. 
--------------------------- 
range range1(10, 20, 1), range2((10, 20, 1); 
range::iterator i = range1.begin(), j = range2.begin(); 
assert(i == j); // would you allow this? 

很抱歉,如果我缺少在STL :)一個簡單的設計規則

回答

3

默認情況下,在STL,從兩個不同的容器中的兩個迭代器沒有可比性。這意味着,行爲是未指定的。所以你做任何你想做的事,沒有人應該嘗試。

迭代器j被稱爲到達從 一個迭代我當且僅當有 一個:

編輯

的標準,24.1節,第仔細尋找6個州之後 的表達式++ i的有限序列使i == j。 如果j從i到達,他們將 指向同一個容器。

這意味着,如果你讓i == jij在兩個不同的容器,你真的認爲這兩個容器爲相同。因爲它們是不變的,所以這非常好。只是一個語義問題。

+0

謝謝。這是我第一次知道這個:)你知道我在哪裏可以找到標準的? – AraK 2010-02-10 02:52:51

+0

我會補充一點,你是否在使用字符串,如果實現對所有字符串執行了實際操作,比較兩個==字符串可能會導致相同的行爲。這不是必需的,但可能會發生。如果確實發生,我不會擔心,但我也不會要求它發生。 – KitsuneYMG 2010-02-10 03:02:12

+0

當你試圖比較指向不同容器的迭代器時,VC至少會抱怨。你知道這個標準是否認爲比較它們是非法的?或者VC只是過度樂於助人? 24.1的第7段看起來與現在最接近,但它實際上描述了「範圍」和「算法」。問題是,即使它們不指向相同的容器,比較'i == j'是否有效? – 2010-02-22 18:59:30

0

在STL中,比較規則是由容器的元素驅動的,而不是容器本身,所以在我看來,你不應該在你的==操作符重載中執行自引用。

1

您可能想檢查boost::counting_iterator

auto rng = boost::make_iterator_range(boost::make_counting_iterator(0), 
             boost::make_counting_iterator(10)); 
for(auto it = rng.begin(), e = rng.end(); it != e; ++it) 
    std::cout << it << " "; // Prints 0,1,2,3,...,9 

對於這個類兩個迭代器被認爲是相等前提是它們含有相同數量的:與boost::iterator_range,你會得到的東西類似於你的範圍類(除了只會讓1步長)相結合。但無可否認,情況與你的情況不同,因爲這裏每個迭代器都不知道它屬於哪個範圍。