在 C++ 中,std::sort
是标准库 <algorithm>
中的一个模板函数,用于对序列进行排序。以下是它的详细使用方法:
基本语法
template< class RandomIt >
void sort( RandomIt first, RandomIt last );
-
first
:指向要排序范围的第一个元素的随机访问迭代器。 -
last
:指向要排序范围的最后一个元素的下一个位置的随机访问迭代器。
默认情况下,std::sort
会对范围 [first, last)
中的元素按升序(从小到大)进行排序。
返回值
std::sort
不返回任何值,它在原地对序列进行排序。
可选参数
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
-
comp
:自定义比较函数,用于定义排序顺序。
示例
1. 使用默认排序(升序)
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {5, 3, 2, 4, 1};
std::sort(vec.begin(), vec.end()); // 默认升序排序
for (int num : vec) {
std::cout << num << " ";
} // 输出:1 2 3 4 5
return 0;
}
2. 使用自定义比较函数(降序)
#include <iostream>
#include <vector>
#include <algorithm>
bool descendingCompare(int a, int b) {
return a > b;
}
int main() {
std::vector<int> vec = {5, 3, 2, 4, 1};
std::sort(vec.begin(), vec.end(), descendingCompare); // 使用自定义比较函数
for (int num : vec) {
std::cout << num << " ";
} // 输出:5 4 3 2 1
return 0;
}
使用 Lambda 表达式更简洁:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {5, 3, 2, 4, 1};
std::sort(vec.begin(), vec.end(), [](int a, int b) { // Lambda 表达式
return a > b;
});
for (int num : vec) {
std::cout << num << " ";
} // 输出:5 4 3 2 1
return 0;
}
3. 使用标准比较函数对象
C++ 标准库提供了一些比较函数对象,如 std::greater
。
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional> // 包含 std::greater
int main() {
std::vector<int> vec = {5, 3, 2, 4, 1};
std::sort(vec.begin(), vec.end(), std::greater<int>()); // 使用 std::greater 进行降序排序
for (int num : vec) {
std::cout << num << " ";
} // 输出:5 4 3 2 1
return 0;
}
4. 对字符串排序
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
int main() {
std::vector<std::string> vec = {"banana", "apple", "cherry", "date"};
std::sort(vec.begin(), vec.end()); // 按字典序排序
for (const std::string& str : vec) {
std::cout << str << " ";
} // 输出:apple banana cherry date
return 0;
}
5. 对自定义对象排序
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
struct Person {
std::string name;
int age;
};
// 自定义比较函数
bool compareByName(const Person& a, const Person& b) {
return a.name < b.name;
}
bool compareByAge(const Person& a, const Person& b) {
return a.age < b.age;
}
int main() {
std::vector<Person> people = {
{"Alice", 30},
{"Bob", 25},
{"Charlie", 35}
};
// 按名字排序
std::sort(people.begin(), people.end(), compareByName);
for (const auto& person : people) {
std::cout << person.name << " " << person.age << std::endl;
}
/*
输出:
Alice 30
Bob 25
Charlie 35
*/
// 按年龄排序
std::sort(people.begin(), people.end(), compareByAge);
for (const auto& person : people) {
std::cout << person.name << " " << person.age << std::endl;
}
/*
输出:
Bob 25
Alice 30
Charlie 35
*/
return 0;
}
注意事项
-
随机访问迭代器:
std::sort
要求迭代器必须支持随机访问(如容器std::vector
、std::array
和 C 风格数组)。 -
性能:
std::sort
的平均时间复杂度为 O(N log N),是一种高效的排序算法。 -
稳定性:
std::sort
并不保证稳定性(即相等元素的相对顺序可能会改变)。 -
自定义比较:如果提供自定义比较函数,必须确保它满足严格弱序(即无法比较的元素不允许存在)。