作者:手机用户2402852387 | 2023-08-30 18:46
我知道find方法在std :: map中找到提供的键,并将迭代器返回给元素.反正有没有找到值并获得元素的迭代器?我需要做的是检查std :: map中是否存在指定的值.我通过循环地图中的所有项目并进行比较来完成此操作.但我想知道有没有更好的办法.
这是我写的
bool ContainsValue(Type_ value)
{
bool found = false;
Map_::iterator it = internalMap.begin(); // internalMap is std::map
while(it != internalMap.end())
{
found = (it->second == value);
if(found)
break;
++it;
}
return found;
}
编辑
如何在内部使用另一个存储值,键组合的地图.所以我可以打电话找到它吗?std :: map中的find()是否进行顺序搜索?
谢谢
1> Mark Ransom..:
您可以使用boost :: multi_index创建双向映射 - 您可以使用该对中的任意一个值作为快速查找的键.
2> CodeBuddy..:
如果您可以访问优秀的boost库,那么您应该使用boost :: multi_index来创建双向映射,正如Mark所说.与std :: map不同,它允许您通过键或值查找.
如果您只有STL,那么下面的代码就可以解决问题(模板化可以使用mapped_type支持operator ==的任何类型的map):
#include
3> ChrisW..:
如何在内部使用另一个存储值,键组合的地图.所以我可以打电话找到它吗?
是:维护两个地图,一个地图使用一种类型的密钥,另一个地图使用另一种.
std :: map中的find()是否进行顺序搜索?
不,它是对已排序树的二进制搜索:其速度为O(log(n)).
如此简单却如此之好(特别是在使用boost库时不是一种选择).有我的upvote.我想补充说,对于反转的地图,使用`std :: multimap`可能比`std :: map`更好,因为原始地图可能有重复的值.那些重复的值然后成为反转映射中的键,因此使用`std :: map`会丢失数据.
插入或删除任何内容需要两倍的时间(使用两张地图而不是一张); 但对于大量元素,查找速度会快得多,因为O(log(n))远小于顺序搜索所需的O(n).
4> Evan Teran..:
查看boost的双向映射:http://www.boost.org/doc/libs/1_38_0/libs/bimap/doc/html/index.html
它让两个值都像一把钥匙.
否则,迭代是要走的路.