2009-12-14 107 views
3

當我嘗試在C++的調試模式下使用集合迭代器時,出現「map/set iterator not dereferenable」錯誤。我不明白,因爲我認爲這是你應該使用迭代器的方式。代碼如下所示:在C++中使用集合迭代器

set<int>::iterator myIterator; 
for(myIterator = mySet.begin(); 
    myIterator != mySet.end(); 
    myIterator++) 
    DoSomething(*myIterator) 

這是我在網上看到有關如何使用迭代器的所有示例的格式。我究竟做錯了什麼?

+0

什麼是DoSomething聲明爲? – Glen 2009-12-14 22:04:39

+3

這個例子看起來似乎是正確的(除了缺少';')。您需要發佈更完整的內容,這些內容實際上會顯示您遇到的問題。例如,「mySet」如何填充? – 2009-12-14 22:05:36

+0

它是編譯時還是運行時錯誤? – shoosh 2009-12-14 22:09:10

回答

7

如果DoSomething()更改集 - 刪除或插入項目,那麼您持有的迭代器將失效,這可能會導致此錯誤。

+2

只有稍微真實:只有當它所引用的項目從集合中被移除時,'std :: set'迭代器纔會失效:您可以插入任何項目,並刪除除一個項目之外的任何項目。見23.1.2/8。 – 2009-12-14 22:30:43

1

該錯誤通常意味着您正在訪問「end()」迭代器。

+0

鑑於循環的條件,我不太確定在這裏情況如何。不過,我可能是錯的:如果我錯了,有人可以給我一個小例子或解釋嗎?謝謝。 – 2009-12-14 22:15:39

+0

白金:問題中的實際代碼不是他正在運行的,這只是他的印象(「看起來像」)。 – 2009-12-14 22:32:01

1

這個問題是基於一個錯誤的前提。我看到了錯誤「map/set iterator not derefereenable」,並認爲這是一個適用於所有map/set迭代器的通用語句,就像我說的那樣是沒有意義的。但是我又看了一遍,真正的問題是我用來訪問該迭代器的指針是無效的。

2

你做錯了的第一件也是最重要的事就是編寫這樣的代碼。以上是以下手動編寫的等價物:

std::for_each(mySet.begin(), mySet.end(), DoSomething); 

實現算法之外的迭代器相對較少使用。偶爾使用map或multimap(或unordered_ [multi] map)是合理的,但這主要是使用std :: pair來補償map和multimap,這並不完美。

+0

如果你決定避免編寫一個循環,你可以使用'unary_compose'和一個將一對映射到它的第一個或第二個元素的函數。 – 2009-12-14 23:08:44