首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在定义映射/集时实例化比较函数(函子)?

如何在定义映射/集时实例化比较函数(函子)?
EN

Stack Overflow用户
提问于 2013-10-07 06:43:51
回答 1查看 869关注 0票数 3

我使用函数对象为map/set指定比较函数:

代码语言:javascript
复制
struct CompareObject {
    bool operator()(Node* const n1, Node* const n2) const;
}; 

据我所知,定义这样的集合不会创建CompareObject的任何实例,而会假装它是静态的:

代码语言:javascript
复制
std::multiset<Node*, CompareObject> set;

但在我的问题中,我需要将Tree的一个实例传递给它,因为我在实际的比较函数中使用它:

代码语言:javascript
复制
bool
CompareObject::operator()(Node* const n1, Node* const n2) const {
  if (tree->getNoOfGood(n1) > tree->getNoOfGood(n2)) return false;
  if (tree->getNoOfGood(n2) > tree->getNoOfGood(n1)) return true;
  return false;
}

因此,我在CompareObject定义中添加了一些字段:

代码语言:javascript
复制
struct CompareObject {

  Tree& tree;              // added
  CompareObject(Tree& t);  // added

  bool operator()(Node* const n1, Node* const n2) const;
}; 

我遇到的问题是,我不知道如何用集合的定义来安装这个对象。

我想到的第一件事是:

代码语言:javascript
复制
std::multiset<Node*, CompareObjects(*this)> shapesMap; // not valid code

但毫不奇怪,它给了我一个错误:“this”不能出现在常量表达式中。

你有什么办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-07 06:48:33

您可以将函子的一个实例作为参数传递给set构造函数。所以有点像multiset<Node*, CompareObject> shapesSet(CompareObject(myTree));

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19218536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档