STL 笔记(五) 算法 algorithm
来源:互联网 发布:网络交换机怎么安装 编辑:程序博客网 时间:2024/06/05 11:07
转载:http://blog.csdn.net/thisinnocence/article/details/39941603
在 STL 中,算法是一系列的函数模版。STL 提供了大概 70 个算法,由头文件 <algorithm>、<numeric>、<functional>组成。
- 头文件 <algorithm> 是最大的一个,里面常用到的功能有:查找、排序、修改、移除、交换、合并等;
- 头文件 <numeric> 较小,主要包括相关数学运算的函数模版,以及加法和乘法在序列上的一些操作;
- 头文件 <functional> 中则定义了一些类模版,来声明函数对象;
算法的分类:
- 算法按其实现的功能可分为 8 类:查找、排序、数值计算、比较、集合、容器管理、统计、 堆操作;
- 算法按对容器的影响可分为 4 类:非修正、修正、排序、数值计算;
非修正算法
非修正即不对容器中元素做修改,是只读操作。如:find()、count()、equal()、for_each()、search()等。具体如下:- adjacent_find #查找相同的相邻元素 返回第一个元素的迭代器
- find #查找
- find_first_of
- find_end
- find_last_of
- count #统计相同元素的个数
- count_if
- mismatch #返回 pair<第一个序列的迭代器,第二个序列的迭代器> 表明第一处不相符合的位置
- equal #比较容器中的元素是否相同
- for_each #常用,遍历序列并对序列中每个元素采用仿函数中定义的操作
- search #返回迭代器,第一次出现序列二或者某元素的位置
- 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
排序算法
排序需要移动元素,所以需要用到随机访问迭代器 RandomAccessIterator,并且指定 [begin,end) 这个前闭后开区间,且可自己定义比较函数做参数传入。常见容器的排序
- vector 和 deque,还有数组,支持随机存取,可以用 algorithm 中的排序;
- list 容器是双向链表,不支持随机访问迭代器,内置了一种稳定排序方法,用的是自底向上的归并排序;
- map 和 set 底层是红黑树,本身就是有序存储;
常用的排序函数
- 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】
0 0
- STL 笔记(五) 算法 algorithm
- STL 笔记(五) 算法 algorithm
- C++ STL学习笔记--------算法 <algorithm>中各种算法解析
- STL algorithm算法adjacent_find(4)
- STL algorithm算法fill_n(15)
- STL algorithm算法find(16)
- STL algorithm算法for_each(21)
- STL algorithm算法lexicographical_compare(30)
- STL algorithm算法search,search_n(52)
- STL algorithm算法set_difference,set_intersection(53)
- STL algorithm算法unique,unique_copy(58)
- STL algorithm算法(01):adjacent_find
- STL algorithm算法(02):all_of
- STL algorithm算法集合
- 【STL】algorithm算法介绍
- STL algorithm 笔记
- STL algorithm算法binary_search(5)
- STL algorithm算法copy(6)
- Windows 驱动开发 - 7
- 写在第一个技术博客前
- 折半查找(二分的两种写法)
- java学习之旅32--面向对象_05_程序执行过程的内存分析_02
- linux下C语言错误整理
- STL 笔记(五) 算法 algorithm
- 笔记
- EL表达式处理字符串
- NSTimer产生的问题及解决方案
- 线程Thread的生命周期以及状态
- 测试
- 手把手教你如何去除土豆,优酷..等等播放前的广告!
- 欢迎使用CSDN-markdown编辑器
- 原创实用代码(一)