如何查找给定的键是否存在于 std::map 中
我正在尝试检查给定的键是否在地图中,但有些无法做到:
typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want
cout << p.first;//I'm getting error here
那么如何打印 p 中的内容?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(15)
使用
map::find
和map::end
:Use
map::find
andmap::end
:要检查映射中是否存在特定键,请按以下方式之一使用
count
成员函数:map::find 的文档 说:“可以使用另一个成员函数
map::count
只是检查特定密钥是否存在。”map::count
的 文档 说: “因为地图容器中的所有元素都是唯一的,所以该函数只能返回 1(如果找到该元素)或零(否则)。”要通过您知道存在的键从映射中检索值,请使用 map:: at:
与 map::operator[], 如果指定的键不存在,
map::at
不会在映射中创建新的键。To check if a particular key in the map exists, use the
count
member function in one of the following ways:The documentation for
map::find
says: "Another member function,map::count
, can be used to just check whether a particular key exists."The documentation for
map::count
says: "Because all elements in a map container are unique, the function can only return 1 (if the element is found) or zero (otherwise)."To retrieve a value from the map via a key that you know to exist, use map::at:
Unlike map::operator[],
map::at
will not create a new key in the map if the specified key does not exist.C++20 为我们提供了
std::map::contains
来做到这一点。C++20 gives us
std::map::contains
to do that.您可以使用
.find()
:You can use
.find()
:C++17 通过 带有初始值设定项的 If 语句。
这样你就可以鱼和熊掌兼得。
C++17 simplified this a bit more with an If statements with initializer.
This way you can have your cake and eat it too.
如果你想使用其他API,那么找到go for
m.count(c)>0
If you want to use other API, then find go for
m.count(c)>0
我想你想要
map::find
。如果m.find("f")
等于m.end()
,则未找到该键。否则,find 返回一个指向找到的元素的迭代器。该错误是因为
p.first
是一个迭代器,它不适用于流插入。将最后一行更改为cout << (p.first)->first;
。p
是一对迭代器,p.first
是迭代器,p.first->first
是键字符串。一张地图对于给定的键只能有一个元素,因此
equal_range
并不是很有用。它是为映射定义的,因为它是为所有关联容器定义的,但它对于多重映射更有趣。I think you want
map::find
. Ifm.find("f")
is equal tom.end()
, then the key was not found. Otherwise, find returns an iterator pointing at the element found.The error is because
p.first
is an iterator, which doesn't work for stream insertion. Change your last line tocout << (p.first)->first;
.p
is a pair of iterators,p.first
is an iterator,p.first->first
is the key string.A map can only ever have one element for a given key, so
equal_range
isn't very useful. It's defined for map, because it's defined for all associative containers, but it's a lot more interesting for multimap.当然,如果你想变得更奇特,你总是可以模板化一个函数,它也接受一个找到的函数和一个未找到的函数,像这样:
并像这样使用它:
这样做的缺点是想出一个好名字,“ find_and_execute”很尴尬,我想不出更好的办法......
Of course if you wanted to get fancier you could always template out a function that also took a found function and a not found function, something like this:
And use it like this:
The downside to this is coming up with a good name, "find_and_execute" is awkward and I can't come up with anything better off the top of my head...
检查 key 是否存在,并返回出现次数(map 中为 0/1):
检查 key 是否存在,并返回迭代器:
在你的问题中,由错误的
operator<<
重载引起的错误,因为p.first
是map
,你可以不打印出来。试试这个:check key exist or not, and return number of occurs(0/1 in map):
check key exist or not, and return iterator:
in your question, the error caused by bad
operator<<
overload, becausep.first
ismap<string, string>
, you can not print it out. try this:小心地将查找结果与地图“m”的结尾进行比较,因为所有答案都有
上面完成
地图::迭代器 i = m.find("f");
您不应该尝试执行任何操作,例如如果迭代器 i 等于 m.end() 则打印键或值,否则会导致分段错误。
Be careful in comparing the find result with the the end like for map 'm' as all answer have
done above
map::iterator i = m.find("f");
you should not try and perform any operation such as printing the key or value with iterator i if its equal to m.end() else it will lead to segmentation fault.
比较 std::map::find 和 std::map::count 的代码,我想说第一个可能会产生一些性能优势:
Comparing the code of std::map::find and std::map::count, I'd say the first may yield some performance advantage:
我知道这个问题已经有一些很好的答案,但我认为我的解决方案值得分享。
它适用于
std::map
和std::vector>
并且可从 C++11 获得。I know this question already has some good answers but I think my solution is worth of sharing.
It works for both
std::map
andstd::vector<std::pair<T, U>>
and is available from C++11.find() 和 contains() 可以使用。根据文档。两种方法平均花费恒定时间,在最坏情况下花费线性时间。
Both find() and contains() can be used. According to the documentation. Both methods take constant time on average and linear time in the worst case.
如果你想比较一对地图,你可以使用这个方法:
这是一个有用的技术。
If you want to compare pair of map you can use this method:
This is a useful technique.