📅  最后修改于: 2023-12-03 15:13:55.392000             🧑  作者: Mango
C++ STL (Standard Template Library)是C++标准库的一部分,提供了丰富的数据结构和算法。其中,algorithm
头文件中提供了算法相关的函数,其中包括 sort()
函数,用于给容器中的元素排序。
template <typename T>
void sort(T begin, T end);
begin
:需要排序的容器中的首个元素的迭代器。end
:需要排序的容器中的最后一个元素之后的迭代器。sort()
函数可以用于排序包括数组、vector、deque、list、forward_list和string等。支持对数值类型(如int、double)和自定义类型的排序。
sort()
函数支持排序类型包括:
默认排序使用元素的 operator <
实现,比如对于 vector<int>
,会按照从小到大的方式进行排序。
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
int main() {
vector<int> vec = { 3, 2, 5, 1, 4 };
sort(vec.begin(), vec.end());
for(const auto& e : vec) {
cout << e << " ";
}
}
输出结果:
1 2 3 4 5
自定义排序需要提供一个二元谓词,定义排序顺序。
lambda function 方便对需要排序的容器中元素的多种属性进行排序
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
int main() {
struct Book {
string author;
string title;
unsigned year;
};
vector<Book> books = {
{"Jack Kerouac", "On the Road", 1957},
{"J.D. Salinger", "Catcher in the Rye", 1951},
{"F. Scott Fitzgerald", "The Great Gatsby", 1922},
{"Vladimir Nabokov", "Lolita", 1955}
};
sort(begin(books), end(books), [](const Book& a, const Book& b) {
return a.year < b.year;
});
for (const auto& book : books) {
cout << book.title << " (" << book.author << ", " << book.year << ")" << endl;
}
}
输出结果:
The Great Gatsby (F. Scott Fitzgerald, 1922)
Catcher in the Rye (J.D. Salinger, 1951)
On the Road (Jack Kerouac, 1957)
Lolita (Vladimir Nabokov, 1955)
functor常用于定义重载运算符的类,是一种函数对象类型,可以通过在类中定义重载运算符(例如<运算符),创造出可调用的对象,并且具有状态。通过重载<运算符,可以自定义排序顺序。
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
class Dog {
public:
Dog(int age, string name) : m_age(age), m_name(name) {}
friend bool operator<(const Dog& lhs, const Dog& rhs) {
return lhs.m_age < rhs.m_age;
}
friend ostream& operator<<(ostream& out, const Dog& dog) {
out << dog.m_name;
return out;
}
private:
int m_age;
string m_name;
};
int main() {
vector<Dog> dogs = { {"Fido", 3}, {"Spike", 1}, {"Wiley", 5} };
sort(begin(dogs), end(dogs));
for(const auto& dog : dogs) {
cout << dog << " ";
}
}
输出结果:
Spike Fido Wiley
使用函数指针排序,需要定义一个二元谓词函数。通过函数指针传递给 sort()
函数进行自定义排序。
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
bool sortByTitle(const Book& a, const Book& b) {
return a.title < b.title;
}
int main() {
struct Book {
string author;
string title;
unsigned year;
};
vector<Book> books = {
{"Jack Kerouac", "On the Road", 1957},
{"J.D. Salinger", "Catcher in the Rye", 1951},
{"F. Scott Fitzgerald", "The Great Gatsby", 1922},
{"Vladimir Nabokov", "Lolita", 1955}
};
sort(begin(books), end(books), sortByTitle);
for (const auto& book : books) {
cout << book.title << " (" << book.author << ", " << book.year << ")" << endl;
}
}
输出结果:
Catcher in the Rye (J.D. Salinger, 1951)
Lolita (Vladimir Nabokov, 1955)
On the Road (Jack Kerouac, 1957)
The Great Gatsby (F. Scott Fitzgerald, 1922)
sort()
函数使用的是快速排序(Quick Sort)的变体,具有以下时间复杂度:
sort()
函数是C++ STL中功能强大的算法之一,可以用于对容器任意类型的元素进行排序。默认排序使用默认的 “less than” 运算符 <
,自定义排序可以通过 lambda function、functor、或者 function pointer 定义二元谓词进行自定义排序。