获取C++ map中的元素索引

SZH*_*SZH 22 c++ indexing std map

我有一个std::mapmyMap我的C++应用程序,我想用要么得到一个元素myMap.find(key)myMap[key].但是,我还想在地图中获取该元素的索引.

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
Run Code Online (Sandbox Code Playgroud)

有干净的方法吗?

谢谢.

Mah*_*din 53

我来到这里寻求这个答案,但我发现这个距离函数需要2个迭代器并返回一个索引

cout << distance(mymap.begin(),mymap.find("198765432"));
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助:D

  • 这真的是问题的答案. (12认同)
  • 它没有`O(N)`复杂度吗? (2认同)

Jar*_*Par 8

A std::map实际上没有索引,而是具有键/值对的迭代器.这类似于索引,因为它表示集合中的排序位置,但它不是数字.要获取键/值对的迭代器,请使用该find方法

std::map<string, int>::iterator it = myMap.find("myKey");
Run Code Online (Sandbox Code Playgroud)


off*_*555 8

大多数情况下,当您使用索引和地图时,这通常意味着您的地图在一些插入后是固定的。如果这个假设适用于您的用例,您可以使用我的答案。

如果您的映射已经固定(之后您不会添加/删除任何键),并且您想找到键的索引,只需创建一个从键映射到索引的新映射。

std::map<string, int> key2index; // you can use unordered_map for it to be faster
int i = 0;
for (pair<K, V> entry : yourMap) {
    key2index[entry.first] = i++;
}
Run Code Online (Sandbox Code Playgroud)

从此key2index映射中,您可以尽可能频繁地查询密钥。只需致电key2index['YourKey']以获取您的索引。

这种方法优于distance函数的好处是访问时间复杂度。O(1)如果您经常查询,它会非常快。

额外部分

如果你想做相反的事情,你想从索引访问密钥,然后执行以下操作。

创建一个数组或向量来存储整个地图的键。然后您可以通过指定索引来访问密钥。

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

要访问i地图的索引,请使用yourMap[keys[i]]。这也O(1)明显更快,因为它只使用数组/向量,而不是地图。