2010-10-19 65 views
1

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

回答

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

的代码是正确的,但你不t真的指出_why_函子是解决方案。如果使用funtor _type_实例化映射,则可以(在运行时)将函子_object_传递给映射构造函数。 – MSalters 2010-10-19 08:40:13

+0

@ MSalters:公平点。我已经稍微更新了我的答案。 – 2010-10-19 10:14:35

相关问题