C++ 定义映射/集时如何实例化比较函数(函子)?
我正在使用funciton对象为map/set指定比较函数:C++ 定义映射/集时如何实例化比较函数(函子)?,c++,std,functor,multiset,C++,Std,Functor,Multiset,我正在使用funciton对象为map/set指定比较函数: struct CompareObject { bool operator()(Node* const n1, Node* const n2) const; }; 据我所知,这样定义一个集合不会创建任何CompareObject实例,而是会假装它是静态的: std::multiset<Node*, CompareObject> set; 因此,我在CompareObject定义中添加了一些字段: struct
struct CompareObject {
bool operator()(Node* const n1, Node* const n2) const;
};
据我所知,这样定义一个集合不会创建任何CompareObject实例,而是会假装它是静态的:
std::multiset<Node*, CompareObject> set;
因此,我在CompareObject定义中添加了一些字段:
struct CompareObject {
Tree& tree; // added
CompareObject(Tree& t); // added
bool operator()(Node* const n1, Node* const n2) const;
};
我遇到的问题是,我不知道如何用集合的定义来稳定这个对象
我首先想到的是:
std::multiset<Node*, CompareObjects(*this)> shapesMap; // not valid code
std::多集形状映射;//无效代码
但毫不奇怪,它给了我一个错误:“this”不能出现在常量表达式中
你知道如何解决这个问题吗?你可以把函子的一个实例作为参数传递给集合构造函数。类似于
multiset shapeset(比较对象(myTree))代码>@msgmaxim我认为编译器可能正在将初始化解析为函数声明。尝试在CompareObject周围添加一组额外的括号:multiset shapeset((CompareObject(myTree))代码>。如果您使用的是C++11,还可以使用统一初始化:shapeset{CompareObject{myTree}代码>附加括号没有帮助,但统一初始化似乎解决了这个问题。顺便说一句,初始化列表也很好用!注意Node*const n
和Node-const*n
和const-Node*n
之间的差异。在第一种情况下,const
应用于指针,因此我们不能使n
指向另一个对象,但可以更改此指针下的数据:n->x=22
。第二和第三个符号不允许更改指针下的对象。您可能需要使用第二个或第三个变体。
std::multiset<Node*, CompareObjects(*this)> shapesMap; // not valid code