如何在C ++类

时间:2016-10-01 21:17:46

标签: c++ templates object stl

这不是一个重复的问题它在这里有所不同,因为比较函数对主类具有依赖性。

我所有的逻辑都在课堂上。我有一张地图nodeCnt,可以查看getCnt()。我正在弄清楚如何为我的优先级队列myCmp进行自定义比较pq,它将根据地图进行比较。

以下代码段不起作用。并且reference docs中描述的auto cmp无法完成,因为Class不能为比较函数提供此类声明。

Class AllLogic {

 private:
   std::map<int, int> nodeCnt;

   // This is my confusing part
   std::priority_queue<int, std::vector<int>, decltype(&myCmp)> pq(&myCmp);

 public:

   int getCnt(int val) {
     if (nodeCnt.find(val) != nodeCnt.end())
         return nodeCnt[val];  
      return 0;
    }

  bool myCmp(int left, int right) {
     return getCnt(left) < getCnt(right);
  } 
};

2 个答案:

答案 0 :(得分:3)

制作这样的结构:

// forward declare your class, because the comparator will use it
class AllLogic;

struct MyCompareT
{
    AllLogic* object;
    bool operator()(int left, int right) const;
};

// after AllLogic has been defined
bool MyCompareT::operator()(int left, int right) const {
    return object->myCmp(left, right);
}

您的priority_queue可以定义为:

std::priority_queue<int, std::vector<int>, MyCompareT> pq;

并在构造函数中初始化如下:

AllLogic() :pq(MyCompareT{this}) {}

答案 1 :(得分:1)

您可以将代码重新编写一下(注意:以下是c ++ 11):

#include <map>
#include <queue>

比较仿函数接受地图的引用,并用它来比较:

struct myCmp {
    explicit myCmp(std::map<int, int> &nodeCnt) : nodeCnt_{&nodeCnt} {}

    bool operator()(int lhs, int rhs) const {
        auto lhs_it = nodeCnt_->find(lhs);
        auto rhs_it = nodeCnt_->find(rhs);
        auto lhs_val = lhs_it == nodeCnt_->end()? 0: lhs_it->second;
        auto rhs_val = rhs_it == nodeCnt_->end()? 0: rhs_it->second;
        return lhs_val < rhs_val; 
    }

private:
   std::map<int, int> *nodeCnt_;
};

该类设置地图,然后是比较仿函数,然后是队列;每一个都使用前一个:

class AllLogic {
private:
   std::map<int, int> nodeCnt;
   myCmp myCmp_{nodeCnt};
   std::priority_queue<int, std::vector<int>, myCmp> pq{myCmp_};
};

int main(){}