我知道std::map
有自己的find方法。但我想知道为什么我们不能使用std::find
。我试过这个
int main()
{
std::map<std::string,std::string> mp;
mp["hello"] = "bye";
if(std::find(mp.begin(),mp.end(),"hello")!=mp.end()))
{
std::cout << "found" ;
}
}
我得到了例外
no matching function for call to 'find(std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >::iterator, std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >::iterator, const char [6])'
if(std::find(mp.begin(),mp.end(),"hello")!=mp.end()))
答案 0 :(得分:3)
我们可以,但我们必须传递适当的论点。地图的“值类型”是由密钥(以const
形式)和值组成的对。因此,您必须传递整对键和值才能使用std::find
:
std::find(mp.begin(),mp.end(),std::make_pair("hello","hello"))
(或类似的东西)
当然,在关联容器的特殊情况下,这很愚蠢:我们通常只想搜索密钥。因此特殊std::map::find
存在。
另外,一个专门的搜索工具“知道”一个地图的内部树状结构,效率要高得多(想想二元搜索!),而不仅仅是将迭代器带到“一些可以迭代的数据”的版本,因此必须以值的顺序线性遍历数据。这就是为什么你想使用std::set::find
,即使set元素的键 是它的值。