我的C ++应用程序中有一个名为std::map
的{{1}},我希望使用myMap
或myMap.find(key)
获取一个元素。但是,我还想在地图中获取该元素的索引。
myMap[key]
有干净的方法吗?
谢谢。
答案 0 :(得分:49)
我来这里寻求这个答案,但我找到了这个 距离函数需要2个迭代器并返回索引
cout << distance(mymap.begin(),mymap.find("198765432"));
希望这会有所帮助:D
答案 1 :(得分:8)
std::map
实际上没有索引,而是有一个键/值对的迭代器。这类似于索引,因为它表示集合中的排序位置,但它不是数字。要获取键/值对的迭代器,请使用find
方法
std::map<string, int>::iterator it = myMap.find("myKey");
答案 2 :(得分:3)
如果您的地图已经修复(之后您不会添加/删除任何键),并且您希望从中获取索引。您可以执行以下操作:
创建一个存储整个地图键的数组。你有它,键可以通过索引访问!
vector<int> keys;
for (pair<K,V> entry : yourMap) {
keys.push_back(entry.first);
}
就是这样。要访问地图的索引i
,请使用yourMap[keys[i]]
此方法优于distance
函数的好处是时间复杂度。这是O(1)
保证。
答案 3 :(得分: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;
}
答案 4 :(得分:0)
地图中没有索引这样的东西。地图不会被存储(不是必须,至少;实际上它们不是在大多数实现中)作为一对“对”。
但是,无论实现如何,std :: map都不会为具有索引的容器建模。
根据您提出的问题,“索引”可以是迭代器(由其他人建议)或密钥本身。
然而,你问这个问题听起来很奇怪。如果您可以向我们提供更多详细信息,我们可能会为您指出更好的问题解决方案。
答案 5 :(得分:0)
地图的语义不包括索引。要理解这一点,您可以注意到地图通常实现为树。因此,其中的元素没有索引(尝试以自然的方式为树定义索引)。
答案 6 :(得分:0)
Map是一种键值数据结构,它在树结构中进行内部数据。上面有O(n)解决方案。 &#34;距离(mymap.begin(),mymap.find(&#34; 198765432&#34;))&#34;不会给你带来正确的答案。 根据您的要求,您必须为O log(n)竞争操作构建自己的分段树类型数据结构。
答案 7 :(得分:0)
一个用例:如果您想知道在进行向量处理时有多少个项目小于或等于多少。约束:i <= j,有多少个v [i]小于或等于v [j])。让我们将其插入地图或集合中。
vector<int> v={1, 4, 2, 3};
set<int> s;
s = {1}; // 1's position is 1 (one based)
s = {1,4}; //4's positon is 2
s = {1, 2, 4} ;//2's position is 2
s = {1 , 2, 3, 4}; //3's positon is 3
似乎std:distance需要O(n)时间。 我可以使用set.lower_bound()并向后计数直到set.begin()来达到相同的效果。有没有人比要求O(n)更好的解决方案,也许使用其他数据结构?
好的,再三考虑,这是一种针对此特定问题存储索引(基于1)的解决方案。但是,这可能无法解决在完成的地图中获取正确的项目索引的问题。
vector<int> arr={1 , 1 , 2, 4, 2};
multimap<int, int> track;
for(auto a:arr)
{
auto it = track.insert(make_pair(a, 1)); //first item is 1
if(it!=track.begin())
{
--it;
int prev=it->second;
it++;
it->second+=prev;
}
cout<<a<<','<<it->second-1<<endl;
}