代码之家  ›  专栏  ›  技术社区  ›  Troskyvs

映射比较函数导致运行时“bad\u function\u call”

  •  1
  • Troskyvs  · 技术社区  · 2 年前

    我正在声明我的std::map并在下面使用它:

        map<int, int, function<bool (int, int)>> m;
        m.insert(make_pair(12,3));
        m.insert(make_pair(3,4));
        for(auto & p : m){
            cout << p.first << "," << p.second << endl;
        }
    

    g++编译,无错误。 模板参数只需要类型,不需要函数体,通过编译。我想知道这个空比较器的性能如何。运行时:

    terminate called after throwing an instance of 'std::bad_function_call'
      what():  bad_function_call
    

    我只在调用纯虚函数时看到这个错误。但我的代码使用的是stl模板,没有多态性。

    那么,这是一个c++设计问题吗?编译不会检查函数是否只有声明,但没有要运行的函数体?另外,c++标准将如何处理这个问题?

    感谢您的解释。

    2 回复  |  直到 2 年前
        1
  •  2
  •   paddy    2 年前

    问题与模板参数无关,但您在构建映射时没有为其提供实际值。

    请注意,在 documentation 对于map构造函数,有一个 const Compare& 参数正是通过此参数,您必须为比较器提供一个值,在本例中,该值为lambda。

    explicit map( const Compare& comp,
                  const Allocator& alloc = Allocator() );
    

    例如:

    #include <functional>
    #include <iostream>
    #include <map>
    
    using namespace std;
    
    int main()
    {
        auto comp = [](int a, int b) { return a > b; };
        map<int, int, function<bool (int, int)>> m(comp);
        m.insert(make_pair(12,3));
        m.insert(make_pair(3,4));
        for(auto & p : m){
            cout << p.first << "," << p.second << endl;
        }
    }
    

    输出:

    12,3
    3,4
    
        2
  •  2
  •   John Park    2 年前

    map<int, int, function<bool (int, int)>> m;

    您声明 std::map 使用您自己的比较器,其签名为 bool(int, int) ,但未提供可调用的函子。

    您应该声明一个真正的可调用对象并将其传递给构造函数,以便您的映射可以在需要时调用它。

    auto order_by_asc = [](int n1, int n2)->bool {return (n1 < n2); };
    std::map<int, int, std::function<bool(int, int)>> m(order_by_asc);