标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要表出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用。
以下算法需要头文件#include
一、排序| sort (first, last) | 对容器或普通数组中 [first, last) 范围内的元素进行排序,默认进行升序排序。 |
| stable_sort (first, last) | 对于 [first, last) 范围内值相同的元素,该函数不会改变它们的相对位置。 |
| partial_sort (first, middle, last) | 从 [first,last) 范围内,筛选出 middle-first 个最小的元素并排序存放在该区间中。 |
| partial_sort_copy (first, last, result_first, result_last) | 从 [first, last) 范围内筛选出 result_last-result_first 个元素排序并存储到 [result_first, result_last) 指定的范围中。 |
| is_sorted (first, last) | 检测 [first, last) 范围内是否已经排好序,默认检测是否按升序排序。 |
| is_sorted_until (first, last) | 如果 [first, last) 范围的元素没有排好序,则该函数会返回一个指向首个不遵循排序规则的元素的迭代器。 |
| void nth_element (first, nth, last) | 找到 [first, last) 范围内按照排序规则(默认按照升序排序)应该位于第 nth 个位置处的元素,并将其放置到此位置。同时使该位置左侧的所有元素都比其存放的元素小,该位置右侧的所有元素都比其存放的元素大。 |
注:
- 容器支持的迭代器类型必须为随机访问迭代器。这意味着,sort() 只对 array、vector、deque 这 3 个容器提供支持。
- 如果对容器中指定区域的元素做默认升序排序,则元素类型必须支持<小于运算符;同样,如果选用标准库提供的其它排序规则,元素类型也必须支持该规则底层实现所用的比较运算符;
- sort() 函数在实现排序时,需要交换容器中元素的存储位置。这种情况下,如果容器中存储的是自定义的类对象,则该类的内部必须提供移动构造函数和移动赋值运算符。
-
int cmp(int a,int b)//自定义排序规则(降序) { return a>b; }
1.merge()//将 2 个有序序列合并为 1 个有序序列
| Iterator merge (Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, Iterator result); | 以默认的升序排序作为排序规则 |
| Iterator merge (Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, Iterator result, Compare comp); | 以自定义的 comp 规则作为排序规则 |
2.inplace_merge()//将2个存储在同一个数组或容器中的有序序列合并为1个有序序列
| void inplace_merge (Iterator first, Iterator middle, Iterator last); | 默认采用升序的排序规则 |
| void inplace_merge (Iterator first, Iterator middle, BidirectionalIterator last, Compare comp); | 采用自定义的 comp 排序规则 |
三、查找
| Iterator find (Iterator first, Iterator last, const T& val); | 在[first,last)内查找等于val的第一个元素 |
| Iterator find_if (Iterator first, Iterator last, UnaryPredicate pred); | find_if() 函数会根据指定的pred查找规则,在[first,last)内查找第一个符合该函数要求(使函数返回 true)的元素。 |
| Iterator find_if_not (Iterator first, Iterator last, UnaryPredicate pred); | 查找第一个不符合谓词函数规则的元素。 |
| Iterator find_end (Iterator first1, Iterator last1, Iterator first2, Iterator last2);(BinaryPredicate pred) | 查找序列 [first1, last1) 中最后一个子序列 [first2, last2) (pred 规则) |
| Iterator find_first_of (Iterator first1, Iterator last1, Iterator first2, Iterator last2);(BinaryPredicate pred) | 在 A 序列中查找和 B 序列中任意元素相匹配的第一个元素(pred 规则) |
| Iterator lower_bound (Iterator first, Iterator last, const T& val);(Compare cmp) | 在 [first, last) 区域内查找不小于 val 的元素(cmp 规则) |
| Iterator upper_bound (Iterator first, Iterator last, const T& val);(Compare cmp) | 查找[first, last)区域中第一个大于 val 的元素。 (cmp 规则) |
| pair | 找到 [first, last) 范围内所有等于 val 的元素 (cmp规则) |
bool cmp(int i) {//自定义查找规则
return ((i%2)==1);
}
四、排列
| bool next(prev)_permutation(iterator start,iterator end) | 当前序列不存在(上)下一个排列时,函数返回false,否则返回true |
| bool is_permutation(_FwdIt1 _First1, _FwdIt1 _Last1, _FwdIt2 _First2) | 检查一个序列是不是另一个序列的排列,如果是,会返回 true。 |
int num[3]={1,2,3};//“原地”生成全排列
do
{
cout<
五、去重
iterator unique(iterator it_1,iterator it_2); 对容器中[it_1,it_2)范围的元素进行去重,返回去重后容器中不重复序列的最后一个元素的下一个元素
vector alls;
sort(alls.begin(), alls.end()); // 将所有值排序
alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去掉重复元素
六、赋值
void fill (Iterator first, Iterator last, const T& val) 为容器中的每个元素赋以val,通常用于初始化
int v[10];
fill(v,v+10,-1);//给一维数组赋值
fill(v[0],v[0]+10*10,-1);//给多维数组赋值



