代码之家  ›  专栏  ›  技术社区  ›  MistyD Harish Kumar Kailas

为什么我们不能将std::find与std::map一起使用

  •  0
  • MistyD Harish Kumar Kailas  · 技术社区  · 8 年前

    我知道 std::map 有自己的查找方法。但我想知道为什么我们不能使用 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()))
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   Lightness Races in Orbit    8 年前

    我们可以,但我们必须通过适当的论证。映射的“值类型”是由键(in)组成的一对 const 形式)和值。因此,为了使用 std::find :

    std::find(mp.begin(),mp.end(),std::make_pair("hello","hello"))
    

    (或类似的)

    当然,在关联容器的特殊情况下,这很愚蠢:我们通常只想搜索关键字。因此 std::map::find 存在。

    此外,一个“了解”地图内部树状结构的专业搜索工具要高效得多(想想二进制搜索!)而不是只使用迭代器访问“可以迭代的数据”,因此必须以值顺序线性遍历数据。这就是为什么你想使用 std::set::find ,即使集合元素的键 它的价值。