函数原型:sort ( iterator beg , iterator end , _Pred )
a
a
参数介绍:
- beg:起始迭代器
- end:终止迭代器
- Pred:谓词(如果不给,默认使用 less<int>() 作为谓词,排序方式为从小到大)
a
a
作用:将迭代器beg和end之间的元素进行排序
a
a
注意1:使用之前包含头文件 <functional>,这个函数不是STL中定义的;
注意2:如果用STL中定义的针对某个容器类型的sort函数,则要包含头文件 <algorithm>;
注意3:定义的比较函数一定要加关键字【static】;
注意4:排序函数内部实现为快排,排序的时间复杂度为 O(n * logn) ;
a
a
补充文章:
https://www.cnblogs.com/BlueBlueSea/p/14030217.html
C++中sort()函数第三个参数(比较函数)为什么要声明为 static?-****博客
不想自己编写排序函数,可以直接使用已经定义好的仿函数:
a
a
如果想对容器中的元素从小到大排序:
- sort ( iterator beg , iterator end )
- sort ( iterator beg , iterator end , less<int>() )
如果想对容器中的元素从大到小排序:
- sort ( iterator beg , iterator end , greater<int>() )
如何编写排序函数:
举例1:
例1:Leetcode_1005_K次取反后最大化的数组和
链接:. - 力扣(LeetCode)
class Solution {
static bool PaiXv(int a, int b) {
return abs(a) > abs(b);
}
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(), nums.end(), PaiXv);
for (int i = 0; i < nums.size(); i++) {
if (nums[i] < 0 && k > 0) {
nums[i] *= -1;
k--;
}
}
if (k % 2 == 1) nums[nums.size() - 1] *= -1;
int result = 0;
for (int a : nums) result += a;
return result;
}
};
注意1:代码中定义的排序是从大到小
注意2:数值a和b都是按照数组nums中元素原本的顺序传递进来的,如果想让其从大到小排列,就需要这么写;如果a和b确实是按照从大到小排列的,就返回true,否则就返回false;
举例2:
例2:Leetcode_406_根据身高体重建队列
链接:. - 力扣(LeetCode)
class Solution {
public:
static bool compare(vector<int> v1, vector<int> v2) {
if(v1[0] > v2[0]) return true;
else if(v1[0] == v2[0] && v1[1] < v2[1]) return true;
return false;
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), compare);
vector<vector<int>> result;
result.push_back(people[0]);
for(int i = 1; i < people.size(); i++) {
result.insert(result.begin() + people[i][1], people[i]);
}
return result;
}
};
注意:代码中定义的排序顺序是先按首元素排序,首元素相同则按次元素排序;
- 排序前:people = [ [7,0] , [4,4] , [7,1] , [5,0] , [6,1] , [5,2] ]
- 排序后:people = [ [7,0] , [7,1] , [6,1] , [5,0] , [5,2] , [4,4] ]