在多重映射中,当两个迭代器保存具有映射到不同 Value 的相同键的值时。我们如何才能在地图中找到它们中的哪一个在另一个之前
Posted
技术标签:
【中文标题】在多重映射中,当两个迭代器保存具有映射到不同 Value 的相同键的值时。我们如何才能在地图中找到它们中的哪一个在另一个之前【英文标题】:In a multimap when two iterator holds values with same key mapped to differnt Value . How can we find which of them comes before the other in map 【发布时间】:2012-01-03 21:16:33 【问题描述】:下面是我的代码,其中我在 map 中插入一些值,其中两个迭代器 it2 保存键和值 "1-1","yes" ,迭代器 it4 保存"1-1","no" 。因为我在 "1-1","no" 之前插入了 "1-1","yes" 。 map 中值“1-1”、“yes”的出现在“1-1”、“no”之前。但是当我尝试比较哪个迭代器之前和之后哪个迭代器然后 mycomp(it2->first,it4->first);或 mycomp(it4->first,it2->first);两种情况下返回的布尔值都是假的。我知道 map 按 Key 进行比较,这里的 key 是相同的,所以在这两种情况下它可能都返回 false 。但是有没有办法确定与哪个迭代器相关的键是否首先存储以及哪个最后存储。我必须实际删除上限和下限之间的所有值。所以在迭代擦除元素时,我需要知道哪个是我的前进方向。
std::multimap<string, string> m;
std::multimap<string, string>::iterator it2;
std::multimap<string, string>::iterator it4;
std::multimap<string, string>::key_compare mycomp;
std::multimap<string, string> common;
mycomp = m.key_comp();
cout <<"Making Map m "<<endl;
m.insert(pair< string, string>("1-1"," yes" ));
m.insert(pair< string, string>("1-1"," no" ));
it2=m.lower_bound("1-0");
it4=it2++;
cout << "it2 values are : " << it2-> first << " and " << it2->second <<endl;
cout << "it4 values are : " << it4-> first << " and " << it4->second<< endl;
bool j =false;
j=mycomp(it2->first,it4->first);
if(j==true)
cout << " value of j returned is true" ;
if(j==false)
cout << " value of j returned is false" ;
【问题讨论】:
一般情况下不会。使用euqal_range()
获取具有相同键的 all 映射条目的范围,但除此之外,您只能靠自己了。这是有意的:数据结构的目的是存储仅由键值标识的元素。如果您需要更强的顺序,请考虑将第二项显式添加到顺序中,并改用set
。
@Kerrek SB 实际上设置只是有价值。在我的情况下,如果我使用 set 我将不得不通过说 strtok 来分解键和值部分以提取单个值“1-1-yes”,并且会有很多比较。有没有办法对地图中与键对应的第二项进行严格排序?
是的,创建一个集合 ;-) 代替multimap<K, V>
,创建一个set<pair<K,V>>
,并使用pair
的自然字典顺序。
【参考方案1】:
我认为不可能知道哪个迭代器出现在前面。甚至不能保证遵守顺序。您可以找到更多信息here。
key_compare 对象仅比较键值以了解第一个键是否在第二个之前。您可以将其视为键的 minor than 运算符。它返回 false,因为两个键相等。
【讨论】:
以上是关于在多重映射中,当两个迭代器保存具有映射到不同 Value 的相同键的值时。我们如何才能在地图中找到它们中的哪一个在另一个之前的主要内容,如果未能解决你的问题,请参考以下文章