STL学习网址:
C语言中文网:http://c.biancheng.net/stl/
在很多应用中,排序都是至关重要的,而且很多 STL 算法也只适用于有序对象序列。定义在 algorithm 头文件中的函数模板 sort<Iter>() 默认会将元素段排成升序,这也就意味着排序的对象的类型需要支持 < 运算符。 对象也必须是可交换的,这说明可以用定义在 utility 头文件中的函数模板 swap() 来对两个对象进行交换。这进一步表明这种对象的类型需要实现移动构造函数和移动赋值运算符。 函数模板 sort<Iter>() 的类型参数 Iter 是元素段元素对应的迭代器类型,而且它们必须支持随机访问迭代器。这表明 sort() 算法只能对提供随机访问迭代器的容器中的元素进行排序,也说明 sort() 只能接受 array、vector、deque 或标准数组中的元素。可以回顾前面章节,list 和 forward_list 容器都有成员函数 sort(); 这些用来排序的特殊成员函数是必要的,因为 list 只提供双向迭代器,且 forward_list 只提供正向迭代器。
有多种方式:
方式1:继承容器,然后重载operator<用于排序时的比较(写在函数体内)
bool operator< (const Person& rt) { return this->id_ < rt.id_; } // 排序函数写法,默认调用operator< sort(members.begin(), members.end());方式2:写比较函数(这种最方便)
bool CompAge(const Person& pl, const Person& pr) { return pl.age_ < pr.age_; } // 排序时传入比较函数指针 sort(members.begin(), members.end(), CompAge);方式3:仿函数
struct CompName { bool operator()(const Person& pl, const Person& pr) { return pl.name_ < pr.name_; } }; // 排序时传入函数对象 sort(members.begin(), members.end(), CompName());方法4:用STL的模板 greater<int>()
int a[5] = {0,1,2,3,4}; vector<int> b(a, a+5); sort(b.begin(), b.end(), greater<int>()); for (auto i : b) cout<<i<<" "; 输出:4 3 2 1 0