STL的排序太坑了,尤其是在VS2010上重载sort函数的第三个比较参数的时候。
invalid operator <
这个错在写多关键字排序的时候就没有停止过。
本来想查书解决,结果各种重载都试了还是不行,百度才知道是因为:strict weak ordering。也就是说,如果a==b,则返回的应该是false,如果返回的是true,则会出上面的错。
参考这个:()
所以最简单的这种比较函数:无论相等或者不等都返回1的写法
1 bool comp(Student s1, Student s2){ 2 if(s1.score==s2.score) 3 return 1; 4 else 5 return s1.id
这两种写法都会报错。
而无论相等或者不等都返回0的写法不会报错
1 bool comp(Student s1, Student s2){ 2 if(s1.score==s2.score) 3 return 0; 4 else 5 return s1.id
故多关键字的STL排序可以写成:
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 struct Node 7 { 8 int x; 9 int y;10 11 };12 bool Comp(Node &a,Node &b)13 {14 if(a.x==b.x) return b.y>a.y; 15 else 16 return a.x>b.x;17 }18 vector node;19 int main()20 {21 srand((unsigned int)time(0));22 for(int i=0;i<10;i++)23 {24 Node a;25 a.x=rand()%(10+1-0)+0;26 a.y=rand()%(10+1-0)+0;27 node.push_back(a);28 }29 sort(node.begin(),node.end(),Comp);30 for(int i=0;i<10;i++)31 {32 printf("%d %d\n",node[i].x,node[i].y);33 }34 }