用 C++ STL 轻松搞定排序
大家好!今天我们来聊聊 C++ 标准模板库(STL)里的那些排序小工具。你可能会想,为什么我们要在意这些排序算法呢?其实,排序在很多程序中都扮演着很重要的角色。幸运的是,C++ 已经帮我们搞定了不少事情。让我们一起看看怎么用 STL 里的函数来让排序变得简单又高效。
快速排序神器:std::sort
先来聊聊 std::sort,这个函数基本上是我们进行排序的首选。它用的是一种混合排序算法,能在大多数情况下实现快速排序。
怎么用?
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> numbers = {5, 2, 9, 1, 5, 6};
std::sort(numbers.begin(), numbers.end());
for (int n : numbers) {
std::cout << n << ' ';
}
return 0;
}
就这么简单,std::sort 默认从小到大排序。如果你想进行降序排序,只要加个比较函数就行了:
std::sort(numbers.begin(), numbers.end(), [](int a, int b) { return b < a; });
这样,numbers 就会从大到小排序。
稳定排序:std::stable_sort
有时候,我们不仅需要排序,还要保持相同元素的顺序。这时候 std::stable_sort 就派上用场了。它和 std::sort 用法差不多,但在内部实现上更复杂,适合需要保持顺序的场合。
std::stable_sort(numbers.begin(), numbers.end());
如果你有个数据结构,比如说员工名单,按年龄排序时希望姓名的顺序不变,那这个函数就很适合。
部分排序:std::partial_sort
假设你只想要找出列表中最大的三个数,怎么办?用 std::partial_sort 吧。只会把你感兴趣的部分排序,把前面几名挑出来。
std::partial_sort(numbers.begin(), numbers.begin() + 3, numbers.end());
这样,numbers 的前三个元素就是最大(或最小)的。
自定义数据类型的排序
要是你有一个自定义的类型,比如存储了姓名和年龄的结构体,也不用担心。我们可以写一个小函数告诉 std::sort 怎么比较这些结构体。
struct Person {
std::string name;
int age;
};
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(), compareByAge);
for (const auto& person : people) {
std::cout << person.name << ": " << person.age << '\n';
}
return 0;
}
通过这个 compareByAge 函数,我们可以很轻松地按年龄对 Person 对象进行排序。
总结一下
总之,C++ STL 的排序功能真的很实用,让你省去了自己实现复杂算法的麻烦。无论是简单的从小到大排序,还是复杂的自定义结构体排序,STL 都能帮你搞定。所以,话不多说,快去试试这些函数吧,看看它们能给你的代码带来多大变化!