2015-09-19 43 views
-1

穿越總之我的問題,在「unordered_map」我會加入一對,名稱以數字,並將其發送給一個函數。 (功能不要緊它做什麼。)於是我將增加的另一件事到圖形的地圖,但我希望能夠穿越到我添加到列表中的下一件事,因爲我想扔標記的名字進入功能。C++,如何通過unordered_map

下面是一些代碼

unordered_map<string,int> graph; 
unordered_map<string,int>:: iterator it; 
using namespace std; 

int main(){ 
    string name; 
    graph.insert(pair<string,int>("Sue",4));  
    it=graph.begin(); 
    name = it -> first; //name is equal to "Sue" 
    function(name); 
    graph.insert(pair<string,int>("Mark",83)); 
    it++ // this will not work 
    name = it -> first; //this will not end up equaling to "Mark" 
    function(name); 
    } 

++it不行,倒退--it,沒有工作過。

那麼有沒有人有一個解決方案,我可以倒退得到name = it -> firstMark

注:(我會做這個方法太多次,因爲它會進入一個循環)

+0

你說的「接下來的事情」是什麼意思?接下來按什麼順序? –

+0

@TemplateRex我所做的唯一事情就是編輯文本。我從來沒有(永遠)刪除或考慮刪除標籤。 (如果這樣的事情發生的情況是不情願還是你錯) – Ziezi

+0

@simplicisveritatis好,編輯歷史表明,你刪除它,但沒有問題,如果它是偶然! – TemplateRex

回答

3

對於unordered_map,它不能保證以後其他項目插入一個項目,也將後存儲該項目。這就是無序地圖的含義。

在這種情況下,你的運氣了:在std::hash<std::string>密謀讓「蘇」來「標記」和it++graph.end()it->first被提領此,有內存錯誤之後。

,如果您使用有序map<string, int>和「標記」之後插入「蘇」(或者你可以使用std::greater爲「蘇」後map比較你原來的「馬克」的順序),然​​後順序元素就是你所期望的。

#include <unordered_map> 
#include <map> 
#include <iostream> 

using namespace std; 
map<string,int> graph; 
map<string,int>:: iterator it; 

int main() 
{ 
    string name; 
    graph.insert(pair<string,int>("Mark",4));  
    it=graph.begin(); 
    name = it -> first; //name is equal to "Sue" 
    std::cout << name; 
    graph.insert(pair<string,int>("Sue",83)); 
    it++ ;// this will not work 
    name = it -> first; //this will not end up equaling to "Mark" 
    std::cout << name; 
} 

Live Example

-1

我想這是因爲當你調用Begin()產生的迭代器值。

在一些其他語言(C#)如果一個IEnumerable(例如List),而一個IEnumerator(亦稱迭代)的變化是活動的,則Enumerator變爲無效 和以下IEnumerator::MoveNext()將引發InvalidOperationException
看到MSDN Article on IEnumerator.MoveNext Method()

而且This article on CPPReference狀態:

如果出現換湯不換藥由於插入,所有迭代器無效。否則迭代器不受影響。引用不會失效。僅當新的元素數量等於或大於max_load_factor()* bucket_count()時纔會重新散列。