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

时间:2010-10-19 08:07:08

标签: c++ stl

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

1 个答案:

答案 0 :(得分:9)

使用functor class

#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));
}

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

如果您在编译时知道value1value2(即如果它们是编译时常量),则可以改为使用函数模板:

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;
}