我可以使用动态构造的比较器创建地图吗?

Tho*_*son 1 c++ stl

我想在STL中创建std :: map,但是比较器依赖于某些动态值,该值仅在运行时可用.我该如何做到这一点?例如,我想要一些看起来像std::map<int, int, Comp(value1, value2)>.value1和value2不是这里的比较数字,它们是某种配置数字.

Oli*_*rth 9

使用仿函数类:

#include <map>

class Comp
{
public:
    Comp(int x, int y) : x(x), y(y) {}
    bool operator() (int a, int b) const { /* Comparison logic goes here */ }
private:
    const int x, y;
};

int main()
{
    std::map<int,float,Comp> m(Comp(value1,value2));
}
Run Code Online (Sandbox Code Playgroud)

这就像一个函数,但是以运行时对象的形式.这意味着它可以具有状态,其中包括运行时配置.你所要做的就是超载operator().如果在类定义中定义了所有成员函数体(如上所述),那么编译器可能会内联所有内容,因此性能开销可以忽略不计.

如果您知道value1并且value2在编译时(即它们是编译时常量),您可以使用函数模板:

template <int x, int y>
bool compare(int a, int b) { /* Comparison logic goes here */ }

int main()
{
    std::map<int,float,compare<value1,value2> > m;
}
Run Code Online (Sandbox Code Playgroud)

  • 代码是正确的,但你没有真正指出_why_仿函数是解决方案.如果使用funtor _type_实例化地图,则可以(在运行时)将仿函数_object_传递给地图构造函数. (3认同)