C++ std::映射比较函子和函数/lambda错误

C++ std::映射比较函子和函数/lambda错误,c++,c++11,compare,stdmap,C++,C++11,Compare,Stdmap,我有以下资料: inputs: Map1["Ram"] = 8; Map1["Aam"] = 8; Map1["Some"] = 2; Map1["He"] = 5; Map1["He"] = 6; 插入到std::map后的预期输出应为: Output: "Some" 2 "He" 5 "He" 6 "Aam" 8 请注意: 排序依据的是值,而不是键 输入Map1[“Ram”]=8已被下一个输入覆

我有以下资料:

inputs:    
    Map1["Ram"] = 8;
    Map1["Aam"] = 8;
    Map1["Some"] = 2;
    Map1["He"] = 5;
    Map1["He"] = 6;
插入到
std::map
后的预期输出应为:

Output:
    "Some" 2  
    "He"   5
    "He"   6
    "Aam"  8
请注意:

  • 排序依据的是值,而不是键
  • 输入
    Map1[“Ram”]=8已被下一个输入覆盖
    Map1[“Aam”]=8
  • 方法1:我想用一个函子来管理它。我有两个错误:

    ||=== Build: Debug in MyTestProgram (compiler: GNU GCC Compiler) ===|
    d:\mingw\include\c++\7.3.0\bits\stl_map.h||In instantiation of 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](std::map<_Key, _Tp, _Compare, _Alloc>::key_type&&) [with _Key = std::__cxx11::basic_string<char>; _Tp = int; _Compare = compare_functor; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = int; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::__cxx11::basic_string<char>]':|
    D:\Programming\C++\CPP Programs\MyTestProgram\MyTestProgram.cpp|22|required from here|
    d:\mingw\include\c++\7.3.0\bits\stl_map.h|511|error: no match for call to '(std::map<std::__cxx11::basic_string<char>, int, compare_functor>::key_compare {aka compare_functor}) (std::map<std::__cxx11::basic_string<char>, int, compare_functor>::key_type&, const std::__cxx11::basic_string<char>&)'|
    D:\Programming\C++\CPP Programs\MyTestProgram\MyTestProgram.cpp|12|note: candidate: bool compare_functor::operator()(const T&, const T&) const|
    D:\Programming\C++\CPP Programs\MyTestProgram\MyTestProgram.cpp|12|note:   no known conversion for argument 1 from 'std::map<std::__cxx11::basic_string<char>, int, compare_functor>::key_type {aka std::__cxx11::basic_string<char>}' to 'const T& {aka const std::pair<std::__cxx11::basic_string<char>, int>&}'|
    d:\mingw\include\c++\7.3.0\bits\stl_tree.h||In instantiation of 'std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_lower_bound(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Link_type, std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Base_ptr, const _Key&) [with _Key = std::__cxx11::basic_string<char>; _Val = std::pair<const std::__cxx11::basic_string<char>, int>; _KeyOfValue = std::_Select1st<std::pair<const std::__cxx11::basic_string<char>, int> >; |
    d:\mingw\include\c++\7.3.0\bits\stl_tree.h|1187|required from 'std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::lower_bound(const key_type&) [with _Key = std::__cxx11::basic_string<char>; _Val = std::pair<const std::__cxx11::basic_string<char>, int>; _KeyOfValue = std::_Select1st<std::pair<const std::__cxx11::basic_string<char>, int> >; _Compare = compare_functor; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, int> >; std::_Rb_tree<_Key, _Val, _KeyOfVa|
    d:\mingw\include\c++\7.3.0\bits\stl_map.h|1234|required from 'std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::lower_bound(const key_type&) [with _Key = std::__cxx11::basic_string<char>; _Tp = int; _Compare = compare_functor; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::__cxx11::basic_string<char>, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::__cxx11::basic_string<char|
    d:\mingw\include\c++\7.3.0\bits\stl_map.h|509|required from 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](std::map<_Key, _Tp, _Compare, _Alloc>::key_type&&) [with _Key = std::__cxx11::basic_string<char>; _Tp = int; _Compare = compare_functor; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = int; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::__cxx11::basic_string<char>]'|
    Program.cpp|22|required from here|
    d:\mingw\include\c++\7.3.0\bits\stl_tree.h|1872|error: no match for call to '(compare_functor) (const std::__cxx11::basic_string<char>&, const std::__cxx11::basic_string<char>&)'|
    Program.cpp|12|note: candidate: bool compare_functor::operator()(const T&, const T&) const|
    Program.cpp|12|note:   no known conversion for argument 1 from 'const std::__cxx11::basic_string<char>' to 'const T& {aka const std::pair<std::__cxx11::basic_string<char>, int>&}'|
    ||=== Build failed: 2 error(s), 7 warning(s) (0 minute(s), 0 second(s)) ===|
    
    std::map
    就是您想要的

    要使用反向语法,可以使用包装器,例如:

    class Wrapper
    {
    public:
        Wrapper(std::map<int, std::string>& m, const std::string& s) : m(m), s(s) {}
    
        void operator =(int k) { m[k] = s; }
    private:
        std::map<int, std::string>& m;
        std::string s;
    };
    
    class InvertedMap
    {
    public:
        Wrapper operator[](const std::string& s) { return {m, s}; }
    
        auto begin() const { return m.begin(); }
        auto end() const { return m.end(); }
    private:
        std::map<int, std::string> m;  
    };
    
    类包装器
    {
    公众:
    包装器(std::map&m,const std::string&s):m(m),s(s){
    void运算符=(int k){m[k]=s;}
    私人:
    标准:map&m;
    std::字符串s;
    };
    类DMAP
    {
    公众:
    包装运算符[](const std::string&s){return{m,s};}
    自动开始()常量{返回m.begin();}
    自动结束()常量{return m.end();}
    私人:
    std::map m;
    };
    
    然后:

    InvertedMap Map1;
    Map1["Ram"] = 8;
    Map1["Aam"] = 8;
    Map1["Some"] = 2;
    Map1["He"] = 5;
    Map1["He"] = 6;
    
    for (const auto& p : Map1) {
        std::cout << p.second << " " << p.first << std::endl;
    }
    
    // Output:
    // Some 2
    // He 5
    // He 6
    // Aam 8
    
    dmap-Map1;
    Map1[“Ram”]=8;
    Map1[“Aam”]=8;
    Map1[“某些”]=2;
    Map1[“他”]=5;
    Map1[“他”]=6;
    用于(常数自动&p:Map1){
    
    std::cout您似乎想要
    std::map
    。您明确地将“值”视为键,将“键”视为值。只需使用
    map
    并完成它。
    std::map
    使用其比较谓词来比较键,而不是{key,value}成对。您的谓词假设后者,并且没有工作的机会。@Jarod42就像我在问题中提到的,是否可以保留
    字符串作为我的密钥本身?并且有相同的结果?您的问题陈述中没有什么比普通的
    映射更需要的了。我不明白您为什么反对这种方法h、 哇……真是太棒了。这就是我想要的。为这个伟大的想法和努力额外加分。:)
    
    class Wrapper
    {
    public:
        Wrapper(std::map<int, std::string>& m, const std::string& s) : m(m), s(s) {}
    
        void operator =(int k) { m[k] = s; }
    private:
        std::map<int, std::string>& m;
        std::string s;
    };
    
    class InvertedMap
    {
    public:
        Wrapper operator[](const std::string& s) { return {m, s}; }
    
        auto begin() const { return m.begin(); }
        auto end() const { return m.end(); }
    private:
        std::map<int, std::string> m;  
    };
    
    InvertedMap Map1;
    Map1["Ram"] = 8;
    Map1["Aam"] = 8;
    Map1["Some"] = 2;
    Map1["He"] = 5;
    Map1["He"] = 6;
    
    for (const auto& p : Map1) {
        std::cout << p.second << " " << p.first << std::endl;
    }
    
    // Output:
    // Some 2
    // He 5
    // He 6
    // Aam 8