2013-07-25 131 views
18

我在我的C++應用程序中有一個std::map調用myMap,我想要得到一個使用myMap.find(key)myMap[key]的元素。但是,我也想獲得地圖中該元素的索引。獲取C++中的元素索引

std::map<string, int> myMap; 
// Populate myMap with a bunch of items... 
myElement = myMap["myKey"]; 
// Now I need to get the index of myElement in myMap 

有沒有乾淨的方法來做到這一點?

謝謝。

+3

map沒有索引,但是是一個迭代器。 – user1810087

+13

我不認爲它真的想要你的意思,但你要求*的是'std :: distance(std :: begin(myMap),myMap.find(「myKey」))''。 – BoBTFish

+0

我很好奇:你爲什麼想這樣做? – Raptor

回答

8

A std::map並沒有真正的索引,而是它有一個鍵/值對的迭代器。這與索引類似,它表示集合中的排序位置,但它不是數字。要獲得一個鍵/值對的迭代器使用方法find

std::map<string, int>::iterator it = myMap.find("myKey"); 
0

在地圖中沒有這樣的東西作爲索引。地圖不會被存儲(至少不是必須的,實際上它們並不在大多數實現中)作爲一系列「對」。

但是,無論如何實現,std :: map沒有爲具有索引的容器建模。

根據您提出的問題,「索引」可以是迭代器(如其他人所建議的)或密鑰本身。

但是,你問這個問題聽起來很奇怪。如果你能給我們更多的細節,我們可能會指出你更好的解決你的問題。

+0

我覺得你編輯你的第二句話的時候太多了;這與真的相反 –

0

語義地圖不包括索引。爲了理解這一點,你可以注意到地圖通常是作爲樹來實現的。因此,它中的元素沒有索引(嘗試以樹的自然方式定義索引)。

1

嗯 - 地圖保持鍵和數據爲一對 所以你可以通過取消映射的迭代器成對或直接成對的第一個元素來提取鍵。

std::map<string, int> myMap; 
std::map<string, int>::iterator it; 

for(it=myMap.begin();it!=myMap.end();it++) 
{ 
    std::cout<<it->first<<std::endl; 
} 
42

我來到這裏尋求這個答案,但我發現這個 距離函數需要2個迭代器並返回一個索引

cout << distance(mymap.begin(),mymap.find("198765432")); 

希望這有助於:d

+9

這真的是問題的答案 – Boinst

+0

它有沒有' O(N)'複雜? – willir

0

Map是一個key-value數據結構內部以樹結構數據。有上述O(n)解決方案。 「distance(mymap.begin(),mymap.find(」198765432「))」不會爲您帶來正確的答案。 根據您的要求,您必須爲Olog(n)競爭性操作構建您自己的分段樹類型數據結構。

1

如果您的地圖已經修復(之後您不會添加/刪除任何鍵),並且您希望獲得索引。您可以執行以下操作:

創建一個存儲整個地圖的鍵的數組。在那裏,你可以通過索引訪問鍵盤!

vector<int> keys; 
for (pair<K,V> entry : yourMap) { 
    keys.push_back(entry.first); 
} 

就是這樣。要訪問地圖的索引i,請使用yourMap[keys[i]]

此方法相對於distance函數的優點是時間複雜度。這是O(1)保證。