在 STL 中,算法是一系列的函数模版。STL 提供了大概 70 个算法,由头文件 <algorithm>、<numeric>、<functional>组成。
算法的分类:
adjacent_find #查找相同的相邻元素 反悔第一个元素的迭代器 find #查找元素 还有find系列查找函数 find_first_of find_end find_last_of count #统计相同元素的个数 count_if mismatch #返回 pair<第一个序列的迭代器,第二个序列的迭代器> 表明第一处不相符合的位置 equal #比较容器中的元素是否相同 for_each #常用,遍历序列并对序列中每个元素采用仿函数中定义的操作 search #返回迭代器,第一次出现序列2或者某元素的位置 search_n #前n次连续出现某元素或者符合条件的第一个位置
修正算法即对容器中元素做修改,需要写操作。如:copy()、remove()、reverse()、swap()、unique()等。具体如下:
copy #复制元素到目的容器 copy_backward #从后往前复制 fill #用某元素填充容器 fill_n generate #把仿函数产生的结果依次复制到容器中 generate_n partition #以仿函数为标准,把容器分成前后两部分,前半部分是能使仿函数返回真的元素,后半返回假 stable_partition random_shuffle #对容器中的元素进行随机排列 remove #删除某一范围内的元素,注意:移除的元素被放到容器末尾,还是可以用迭代器遍历到,函数返回移除后容器的末尾 remove_if erase #擦除区间内所有的元素 replace #在规定区间内把某值换成新值 replace_if replace_copy #把区间内元素复制到目的地并且把其中某些元素替换成新值 replace_copy_if rotate #把middle-end的元素放到first的位置上 rotate_copy swap #元素的交换 swap_ranges transform #把元素按照仿函数中内容转换 unique #保证相邻元素间没有相同的,可以加仿函数做为判断依据,返回最后一个位置的迭代器 unique_copy
sort #对给定区间所有元素进行排序,用的是快排 stable_sort #稳定排序,保证值相等的元素排序后相对位置不变,用归并排序实现 partial_sort #部分排序,保证前n个值有序并且后面的值不在前n个值的范围内,但后面的值不保证有序,堆排序实现 partial_sort_copy #对给定区间复制并排序 nth_element #把第n个元素放到第n个位置上去,比他大的都在后,比他小的都在前,但各自都不保证有序 is_sorted #判断一个区间是否已经排好序 partition #使得符合某个条件的元素放在前面 stable_partition #相对稳定的使得符合某个条件的元素放在前面
less #小于(缺省比较函数) greater #大于 equal_to #等于 less_equal #小于等于 greater_equal #大于等于
使用时不能直接写入仿函数的名字,而是要写其重载的()函数,如 less<int>()。下面是 stl 中的 less 的部分源码:
template <class _Tp> struct less : public binary_function<_Tp,_Tp,bool> { bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; } };
对于基本数据类型和string 可以使用 stl 中现成的函数模版,对于自己定义的类,可以通过自己写比较函数或重载 < 操作符来实现。其中,重载 < 运算符相当于间接的用到了内置的 less
#include <iostream> #include <vector> #include <algorithm> using namespace std; class Test { public: Test(int a):a(a){}; int a; bool operator <(const Test &k) const { return a < k.a; } }; int main(){ vector<Test> a; a.push_back(Test(2)); a.push_back(Test(3)); a.push_back(Test(1)); vector<Test>::iterator iter; sort(a.begin(), a.end()); for(iter = a.begin(); iter != a.end(); ++iter){ cout<< iter->a <<" "; } // 输出排序后:1 2 3 }
数值计算算法主要针对容器中元素,如 accumulate()、inner_product()、partial_sum()、adjacent_difference()和一些推广的数值算法。具体:
accumulate #遍历求和,也可以用仿函数求其他数值 inner_product #内积,相应位置相乘再相加 partial_sum #部分元素之和,把结果放到后一容器中,后一容器的第n个元素师前一容器的前n个容器元素之和 adjacent_difference #相邻元素之差,把结果放到后一容器中
#include <iostream> #include <functional> #include <numeric> #include <vector> using namespace std; int main() { int a[3] = { 2, 2, 3 }; int re = accumulate(a, a + 3, 0); cout << re << endl; // 7, 累加 vector<int> b; b.push_back(2); b.push_back(2); b.push_back(3); int re1 = accumulate(b.begin(), b.end(), 0, plus<int>()); cout << re1 << endl; // 7, 累加 int re2 = accumulate(b.begin(), b.end(), 1, multiplies<int>()); cout << re2; // 12, 累乘 }
binary_search #二分法搜索,在有序容器中提高搜索速度 lower_bound #返回第一次出现该元素的位置 upper_bound #返回最后一次出现该元素的后一位置 equal_range #返回pair<lower_bound,upper_bound> inplace_merge #将连贯有序序列合并 merge #合并两个容器 includes #判断某区间内所有的元素是否在另一区间中 #堆操作 push_heap pop_heap sort_heap make_heap #集合操作 set_intersection set_difference set_symmetric_difference #最值 min #最小 max #最大 min_element #最小位置的迭代器 max_element #最大位置的迭代器 lexicograplical_compare #范围内的字典序比较,前后序列的比较 next_permutation prev_permutation #上一个/下一个全排列
原文地址:http://blog.csdn.net/thisinnocence/article/details/39941603