地图中的C++算法find_if

C++ algorithm find_if in map

提问人:L. Kicki 提问时间:6/20/2022 最后编辑:273KL. Kicki 更新时间:6/20/2022 访问量:161

问:

我想在地图中找到一对并打印出来。 这是我的代码:

    std::map<std::string, std::string> mLoginPasswordMap{ "test", "test2" };
    std::string key1("test");
    std::string value1("test2");
    auto it = std::find_if( mLoginPasswordMap.cbegin(),
                        mLoginPasswordMap.cend(),
                        [&key1, &value1]( const auto& elem )
                        {
                            return ( key1 == elem.first && value1 == elem.second );
                        });

    if( it != mLoginPasswordMap.cend() )
    {
        std::cout << it->first << endl;
        std::cout << it->second << endl;
    }
    if( it == mLoginPasswordMap.cend() )
    {
        std::cout << "No pair in map" << endl;
    }

并且在程序编译时收到这种错误:

usr/include/c++/9/bits/stl_map.h:273:4:   required from ‘std::map<_Key, _Tp, _Compare, _Alloc>::map(_InputIterator, _InputIterator) [with _InputIterator = const char*; _Key = std::__cxx11::basic_string<char>; _Tp = std::__cxx11::basic_string<char>; _Compare = std::less<std::__cxx11::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >]’
main.cpp:23:79:   required from here
/usr/include/c++/9/ext/new_allocator.h:146:4: error: no matching function for call to ‘std::pair<const std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >::pair(const char&)’
  146 |  { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
      |    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我不知道我做错了什么。 有人可以帮助我吗?

C++ 算法 C++11 标准

评论

3赞 Quimby 6/20/2022
这与搜索无关,您错误地初始化了地图。您必须提供成对,而不是单个元素。 例如。mLoginPasswordMap{ {"key", "value" } };
0赞 Aconcagua 6/20/2022
请不要将错误消息粘贴为图像或外部链接,只需将它们作为文本直接复制/粘贴到问题中即可。
0赞 Aconcagua 6/20/2022
题外话:任何代码都最好写成......if(condition) { } if(!condition) { }if(condition) { } else { }
1赞 Evg 6/20/2022
另请注意,这是内部排序的,因此可以进行线性搜索,但效率不高。看看 std::map::find()。std::mapstd::find_if()
0赞 JaMiT 6/20/2022
“这是我的代码:”——这看起来不像是一个完整的例子。你应该把它包装在一个函数中,这样人们就可以复制你的代码块,把它交给编译器,并重现你的结果(c.f.最小的可重现的例子)。这可能很简单,只需在您拥有的东西之前添加行,然后在您拥有的东西之后添加行。好吧,在代码块中列出所需的指令将是一个体贴的接触。void foo() {}#include

答:

0赞 Jeffrey 6/20/2022 #1

只需以简单的方式填充地图,即可:

    std::map<std::string, std::string> mLoginPasswordMap;
    mLoginPasswordMap["test"] = "test2";

然后你的代码就会起作用。

也就是说,这不是使用 .如果您绝对需要搜索(实际上不适用于地图),更好的方法是:map

    std::map<std::string, std::string> mLoginPasswordMap;
    mLoginPasswordMap["test"] = "test2";

    std::string key1("test");
    std::string value1("test2");

    std::map<std::string, std::string>::iterator it;
    for(it = mLoginPasswordMap.lower_bound(key1); it != mLoginPasswordMap.upper_bound(key1); it++)
    {
        if (it->second == value1)
        {
            break;
        }
    }

    if( it != mLoginPasswordMap.cend() && it->second == value1)
    {
        std::cout << it->first << endl;
        std::cout << it->second << endl;
    }
    else
    {
        std::cout << "No pair in map" << endl;
    }

这样,您实际上可以利用 并且不会遍历所有内容。并且是搜索范围的正常方法。mapupper_boundlower_bound

现在,如果你有一个并想搜索给定的密钥:map

    std::map<std::string, std::string> mLoginPasswordMap;
    mLoginPasswordMap["test"] = "test2";

    std::string key1("test");
    std::string value1("test2");

    auto it = mLoginPasswordMap.find(key);
    if(it != mLoginPasswordMap.end())
    {
        std::cout << it->first << endl;
        std::cout << it->second << endl;
    }
    else
    {
        std::cout << "No pair in map" << endl;
    }

评论

0赞 Nathan Pierson 6/20/2022
lower_bound而且似乎仍然比仅仅复杂得多upper_boundmLoginPasswordMap.find(key1);
0赞 Jeffrey 6/20/2022
呸。是的,这是正确的:-)。假设这个答案是面向多映射的,并且是一个更复杂的谓词