SZH*_*SZH 22 c++ indexing std map
我有一个std::map叫myMap我的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
A std::map实际上没有索引,而是具有键/值对的迭代器.这类似于索引,因为它表示集合中的排序位置,但它不是数字.要获取键/值对的迭代器,请使用该find方法
std::map<string, int>::iterator it = myMap.find("myKey");
Run Code Online (Sandbox Code Playgroud)
大多数情况下,当您使用索引和地图时,这通常意味着您的地图在一些插入后是固定的。如果这个假设适用于您的用例,您可以使用我的答案。
如果您的映射已经固定(之后您不会添加/删除任何键),并且您想找到键的索引,只需创建一个从键映射到索引的新映射。
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)明显更快,因为它只使用数组/向量,而不是地图。