重载运算符<后Sort,优先队列以及set的不同识别
同样是重载了运算符<的结构体,使用不同的容器或算法,会有一些差别,主要是优先队列。
#include <cstdio> #include <vector> #include <queue> #include <algorithm> #include <set> using namespace std; struct Node{ int a; int b; bool operator<(const Node& rhs) const { //优先队列必须加上常成员函数标记 if (a != rhs.a) return a < rhs.a; //a升序 //大的优先,可理解为按sort排序后优先取队尾。 else return b > rhs.b; //b降序 } }; /* cmp完成一个和运算符<相反的排序 可观察按此法排序输出顺序和优先队列相同 */ bool cmp(const Node& lhs, const Node& rhs){ if (lhs.a != rhs.a){ return lhs.a > rhs.a; //优先按a降序排序 } else{ return lhs.b < rhs.b; //优先按b升序排序 } } int main() { Node a[10] = { {5,2}, {3,4}, {2,6}, {7,3}, {9,2}, {6,8}, {3,3}, {5,9}, {2,4}, {4,1} }; vector<Node> vec; for (int i = 0; i < 10; ++i){ vec.push_back(a[i]); } sort(vec.begin(), vec.end()); printf("Vector(use < ):\n"); for (vector<Node>::iterator it = vec.begin(); it != vec.end(); ++it) { printf("%d %d\n", it->a, it->b); } sort(vec.begin(), vec.end(), cmp); printf("\nVector(use cmp ):\n"); for (vector<Node>::iterator it = vec.begin(); it != vec.end(); ++it) { printf("%d %d\n", it->a, it->b); } priority_queue<Node> q; for (int i = 0; i < 10; ++i){ q.push(a[i]); } Node tmp; printf("\nPriority Queue:\n"); while (!q.empty()){ tmp = q.top(); q.pop(); printf("%d %d\n", tmp.a, tmp.b); } set<Node> s; for (int i = 0; i < 10; ++i){ s.insert(a[i]); } printf("\nSet:\n"); for (set<Node>::const_iterator it = s.begin(); it != s.end(); ++it){ printf("%d %d\n", it->a, it->b); } return 0; }
运算符<内功能为对结构体二级排序,以sort为标准,就是按a升序排序,当a相等时降序排序,但是将同样的结构体入优先队列再出队输出的顺序和排序完的顺序是相反的,而set的顺序和sort的顺序是一致的。另外,如果使用了cmp进行排序(按a降序,按b升序),则排序的结果与优先队列一致。
以下是上面代码的结果:
Vector(use < ):
2 6
2 4
3 4
3 3
4 1
5 9
5 2
6 8
7 3
9 2
Vector(use cmp ):
9 2
7 3
6 8
5 2
5 9
4 1
3 3
3 4
2 4
2 6
Priority Queue:
9 2
7 3
6 8
5 2
5 9
4 1
3 3
3 4
2 4
2 6
Set:
2 6
2 4
3 4
3 3
4 1
5 9
5 2
6 8
7 3
9 2