快捷搜索: 王者荣耀 脱发

C++ 使用STL时自定义比较函数cmp

以priority_queue的用法为例 方法一

********************************方法一
struct Node {
    int x,y;
    bool operator <(Node a) const  {    //必须加const
        return y < a.y;
    }
    bool operator >(Node a) const  {    //必须加const
        return y > a.y;
    }
};
//  priority_queue<Node> A;   //默认  大根堆
priority_queue<Node, vector<Node>, less<Node>>A;    //大根堆
priority_queue<Node, vector<Node>, greater<Node> > B;    //小根堆

类似方法一

********************************类似方式法一
struct Node {
    int x;
    int y;
    friend  bool operator<(const Node &a,const Node &b) {
        return  a.x < b.x;  //大顶堆
    }
    friend  bool operator>(const Node &a,const Node &b) {
        return  a.x > b.x;  //小顶堆
    }
};

priority_queue<Node> A;   //默认  大根堆
priority_queue<Node, vector<Node>, greater<Node> > B;    //小根堆

方法二

********************************方法二:
struct Node {
    int x;
    int y;
};

bool operator<(const Node &a, const Node &b) {
    return a.x<b.x;          //大顶堆
}

bool operator>(const Node &a, const Node &b) {
    return a.x>b.x;         //小顶堆
}

priority_queue<Node,vector<Node>,less<Node> > A;    //大根堆
priority_queue<Node, vector<Node>, greater<Node> > B;    //小根堆

方法三

//********************************方法三:
struct Node {
    int x;
    int y;
};

struct cmp {
    bool operator()(Node a,Node b) {
        return  a.x > b.x;  //小顶堆
    }
};

struct cmp1 {
    bool operator()(Node a,Node b) {
        return  a.x < b.x;  //大顶堆
    }
};

priority_queue<Node,vector<Node>,cmp1 > A;      //大根堆
priority_queue<Node, vector<Node>, cmp > B;    //小根堆

队列节点是指针

//当队列节点是指针时,用法不同
struct Node {
    int x;
    int y;
};
struct cmp {
    bool operator () (Node const *n1, Node const *n2) {
        return n1->x<n2->x;     //大顶推
    }
};
struct cmp1 {
    bool operator () (Node const *n1, Node const *n2) {
        return n1->x>n2->x;     //小顶推
    }
};

priority_queue<Node*, vector<Node*>, cmp > A;   //大根堆
priority_queue<Node*, vector<Node*>, cmp1 > B;  //小根堆

统一测试

ostream & operator <<(ostream &out,const struct Node& n) {
    out<<"n.x="<<n.x<<"    n.y="<<n.y<<endl;
    return out;
}

const vector<Node>tn= {
         
  {
         
  1,1},{
         
  2,2},{
         
  3,3},{
         
  4,4},{
         
  5,5}};

void test() {
    for (auto &a:tn) {
        A.push(a);
        B.push(a);
    }

    cout<<"A:"<<endl;
    while(!A.empty()) {
        cout<<A.top();
        A.pop();
    }

    cout<<"B:"<<endl;
    while(!B.empty()) {
        cout<<B.top();
        B.pop();
    }
}

int main() {
    test();
    return 0;
}
经验分享 程序员 微信小程序 职场和发展