




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
STL整理 v4 by Felix021使用STL的时候很需要注意的一点是, STL的区间都是左闭右开的.e.g. start, end) 表示从start开始到end之前一个位置以下挑选一些比较方便使用的STL算法作简要说明。1. for_eachvoid foreach(iterator begin, iterator end, class func);将begin, end)上的每个元素传给只有一个参数(一元)的func函数/仿函数进行处理。例:void neg(int &i) i = -i; void f()int nums5 = 1, 2, 3, 4, 5);vectora(num, num+5);for_each(a.begin(), a.end(), neg);/a中元素变为其相反数注意:如果需要对元素进行改动,定义的函数和仿函数中需要使用引用传参。2. min_element / max_element iterator min_element(iterator begin, iterator end);iterator min_element(iterator begin, iterator end, Cmpfunc func);iterator max_element(iterator begin, iterator end);iterator max_element(iterator begin, iterator end, Cmpfunc func);返回区间being, end)之间的最小/最大元素,可以提供比较函数/仿函数(二元),返回一个指向该元素的迭代器(对于数组则返回相应的指针)。3. copy / copy_n /copy_backwarditerator copy(iterator begin, iterator end, iterator to);iterator copy_n(iterator begin, size_t n, iterator to);copy把begin, end)之间的元素拷贝到从to开始的一段区间,拷贝完毕后返回目标区间的结尾(最后一个拷贝位置的下一个位置)。copy_n把从begin开始的n个元素拷贝到从to开始的位置,返回目标区间的结尾(同copy)。iterator和可以是普通的iterator或者reverse_iterator, 也可以是数组的指针。例:int a3 = 1, 2, 3, b3;copy(a, a+3, b); /把区间a, a+3)的元素拷贝到从b开始的等长区间copy_n(a, 3, b); /把从a开始的3个元素拷贝到从b开始的等长区间4. fill / fill_nvoid fill(iterator first, iterator last, const T& value);将first, end)之间的元素赋值为valueiterator fill_n(iterator first, Size n, const T& value);将从first开始的n个元素赋值为valueint a10;例:fill(a, a+10, 0); /用0填充区间a, a+10)fill(a, 10, 0); /用0填充从a开始的10个元素5. remove / remove_ifiterator remove(iterator begin, iterator end, const T &value)iterator remove_if(iterator begin, iterator end, function test)按区间中原有元素的相对次序将不需要移除的元素提前,覆盖需要被删除的元素(指定值,或是(一元判断函数test)返回true的值),返回新的结尾。它不删除新的结尾和旧的结尾之间的元素,所以一般是结合erase使用:例:vectorvt;for( i=0; i10; i+) vt.push_back(i);vt.erase(remove(vt.begin(), vt.end(), 3), vt.end();6. uniqueiterator unique (iterator begin, iterator end, Cmpfunc cmp)按区间中原有元素的相对次序将多余的重复元素用其后的有效元素覆盖,返回新的结尾。如果区间是将(二元比较函数cmp)传给sort函数排序的,那么需要将(cmp函数)传给unique才可以得到想要的结果。和remove一样unique并不真的移除新的结尾和旧的结尾之间的元素,所以一般也需要结合erase使用。例:vectorvt;for( i=0; i10; i+) vt.push_back(i); vt.push_back(i+1); vt.erase(unique(vt.begin(), vt.end(), vt.end();7. rotateiterator rotate(iterator begin, iterator middle, iterator end);将begin, middle)和middle, end)两个区间内的元素互换。最多只需要end-begin次交换。例:char alpha = abcdefghijklmnopqrstuvwxyz;rotate(alpha, alpha + 13, alpha + 26);printf(%sn, alpha); / 输出为 nopqrstuvwxyzabcdefghijklm8. random_shufflerandom_shuffle (iterator begin, iterator end)将begin, end)之间的元素随机重排列例:const int N = 8;int A = 1, 2, 3, 4, 5, 6, 7, 8;random_shuffle(A, A + N);copy(A, A + N, ostream_iterator(cout, );/ 输出可能为 7 1 6 3 2 5 4 8, 或其它40,319中排列中的任意一种9. partition / stable_partitioniterator partition (iterator begin, iterator end, function test) iterator stable_partition (iterator begin, iterator end, function test)把符合条件(一元判断函数test)的元素移动到区间的前面,不符合条件的移动到后面,返回指向第一个不符合条件元素的迭代器mid,则符合条件的元素在begin, mid)之间,不符合条件的元素在mid, end)之间。注意,partition是不稳定的,stable_partition是稳定的。例:bool test(int i) return i 5;void f() int b10 = 0, 5, 2, 6, 7, 3, 9, 1, 8, 4;vectora.assign(b, b+10);vector:iterator p;p = stable_partition(a.begin(), a.end(), test);copy(a.begin(), p, ostream_iterator(cout, “ “);cout endl; copy(p, a.end(), ostream_iterator(cout, “ “); /大于5的元素先输出,换行,输出小于等于5的元素10. sort / stable_sortvoid sort(iterator begin, iterator end, Cmpfunc func)void stable_sort(iterator begin, iterator end, Cmpfunc func)将begin, end)之间的元素使用默认的(operator)或给定的(二元比较函数func)进行排序,sort使用随机化快速排序,不稳定;stable_sort使用归并排序,稳定。例:int a10 = 0, 5, 2, 6, 7, 3, 9, 1, 8, 4;sort(a, a+10);copy(a, a + 10, ostream_iterator(cout, “, “);/输出 0, 1, 2, 3, 4, 5, 6, 7, 8, 911. partial_sortvoid partial_sort( iterator begin, iterator middle, iterator end, Cmpfunc cmp);将区间begin, end)之间的元素部分排序,使得在begin, middle)之间的元素是最小的(middle-begin)个元素,且是升序排列的(默认使用operator排序,或使用提供的cmp函数排序)。middle, end)之间的元素是乱序的。12. nth_elementvoid nth_element( iterator begin, iterator middle, iterator end, Cmpfunc cmp);假设m是排序后第(middle-begin)个元素,那么nth_element将m放置在middle位置, 排在m前面的元素在begin, middle), 排在m后面的元素在middle, end)。两个区间都是无序的。例:int a10 = 2, 0, 5, 6, 7, 1, 9, 3, 8, 4;nth_element(a, a + 2, a + 10);copy(a, a + 10, ostream_iterator(cout, “ “);/输出 1 0 2 3 4 7 9 6 8 513. lower_bound / upper_bound /要求区间有序iterator lower_bound(iterator begin, iterator end, Const Type &value, Cmpfunc func)iterator upper_bound(iterator begin, iterator end, Const Type &value, Cmpfunc func)函数在有序区间中查找,lower_bound返回指向区间中=value的第一个元素的迭代器, upper_bound返回区间中value的第一个元素的迭代器。如果有序区间排序时(比如sort)使用的是func函数进行比较,那么也需要该函数进行判断。如果区间可随机访问,效率是log2n; 否则需要进行最多n次移动和log2n次比较。例:/区间中有指定元素int a8 = 0, 1, 2, 2, 3, 4, 5, 6;lower_bound(a, a + 8, 2) 返回的是 (a+2) 指向第一个2upper_bound(a, a + 8, 2) 返回的是 (a+4) 指向3 /区间中没有指定元素,lower_bound和upper_bound的返回值是一样的int a8 = 0, 1, 3, 4, 5, 6, 7, 8;lower_bound(a, a + 8, 2) 返回的是 (a+2) 指向3upper_bound(a, a + 8, 2) 返回的是 (a+2) 指向314. binary_search /要求有序区间void binary_search( iterator begin, iterator end, const Type &value, Cmpfunc func);查找指定的有序区间中是否有值等于value的元素,如果有,返回true,否则返回false。如果有序区间排序时(比如sort)使用的是func函数进行比较,那么binary_search也需要该函数进行判断。如果区间可随机访问,效率是log2n; 否则需要进行最多n次移动和log2n次比较。15. merge / inplace_mergeiterator merge(iterator begin1, iterator end1, iterator begin2, iterator end2, iterator dest, Cmpfunc func);将两个有序区间合并到从dest开始的区间,返回目的区间的结尾。void inplace_merge(iterator begin, iterator middle, iterator end, Cmpfunc func);将有序区间begin, middle)和middle, end)合并到begin, end)。16. includesbool includes(iterator begin1, iterator end1, iterator begin2, iterator end2, StrictWeakOrdering comp);判断有序区间begin2, end2)中每个元素是否都在begin1, end1)中。17. set_union,set_intersection,set_difference,set_symmetric_diffrece这四个算法是求有序区间的并、交、差、对称差,并保存到一个新的区间中去。最好是只对没有重复元素的有序区间使用这四个算法,答案比较直观。-a并biterator set_union(iterator begin1, iterator end1, iterator begin2, iterator end2iterator dest, StrictWeakOrdering comp);求有序区间abegin1, end1)和bbegin2, end2)的并,保存在dest开始的区间,并返回其结尾。如果同一个元素在a出现m次,在b出现n次,则会保留max(m,n)个。-a交b iterator set_union(iterator begin1, iterator end1, iterator begin2, iterator end2iterator dest, Cmpfunc func);求有序区间abegin1, end1)和bbegin2, end2)的交,保存在dest开始的区间,并返回其结尾。如果同一个元素在a出现m次,在b出现n次,则会保留min(m,n)个。-a减biterator set_intersection(iterator begin1, iterator end1, iterator begin2, iterator end2iterator dest, Cmpfunc func)求有序区间abegin1, end1)对bbegin2, end2)的差,保存在dest开始的区间,并返回其结尾。如果同一个元素在a出现m次,在b出现n次,则会保留max(m-n, 0)个。-(a-b)并(b-a),既不在a也不在b中的所有元素iterator set_union(iterator begin1, iterator end1, iterator begin2, iterator end2iterator dest, Cmpfunc func);求有序区间abegin1, end1)和bbegin2, end2)的对称差,保存在dest开始的区间,并返回其结尾。如果同一个元素在a出现m次,在b出现n次,则会保留abs(m-n)个。18. next_permutation / prev_permutationbool next_permutation(iterator begin, iterator end, Cmpfunc func); bool prev_permutation(iterator begin, iterator end, Cmpfunc func);将能够随机访问的begin, end)之间的序列转换到上一个/下一个序列,可以给定比较函数。如果已经是最后一个序列,就把序列修改为最小/大的状态(就像整形溢出一样)。效率是一般dfs枚举的2倍(n=11的测试结果)。注意:在开始使用这两个函数之前首先对begin, end)进行初始化,并且最好采用do /somethingwhile(next_permutation(begin, end);这样的循环,保证初始个序列会被处理。例:int perm6, count1 = 0; for(int i = 0; i 6; i+) permi = i; do count1 +; while(next_permutation(perm, perm+n);cout endl count1 =0。20. heap operations在可以随机访问的容器上进行堆操作。-判断是否是堆bool is_head(iterator begin, iterator end, Cmpfunc cmp);按照指定的顺序(默认operator,或指定cmp比较)如果begin, end)是堆即返回true-建立堆void make_head(iterator begin, iterator end, Cmpfunc cmp);在begin, end)的区间上建立堆。可指定比较函数-插入元素到堆void push_heap(iterator begin, iterator end, Cmpfunc cmp);前提:begin, end)是堆,将end指向的元素插入堆中,新堆为begin, end+1)。使用之前需要先把元素插入到end所指位置(比如push_back),然后调用push_heap。-从堆中移除void pop_heap(iterator begin, iterator end, Cmpfunc cmp);前提:begin, end)是堆,将beign指向的元素移除,新堆为begin, end-1)。被移除的元素实际上放置在end-1位置,该位置不会被释放。-堆排序void sort_heap(iterator begin, iterator end, Cmpfunc cmp);前提:begin, end)是堆,将begin, end)排序(不稳定)。例: vectora; int v6 = 4,2,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州铜仁职业技术学院引进博士研究生15人考前自测高频考点模拟试题及答案详解(易错题)
- 2025辽宁沈阳市东北大学非教师岗位招聘25人模拟试卷及答案详解(必刷)
- 2025安徽马鞍山市和县引进高中教师12人模拟试卷及完整答案详解一套
- 2025年主题公园沉浸式体验项目市场前景分析与项目开发策略报告
- 2025年储能电池在电力现货市场中的储能系统性能优化与交易策略报告
- 公司员工培训协议书
- 是否协议书利
- 委托拍卖协议书
- 挂协议书封号
- 车辆出租协议书
- 厨房规划和设计行业营销策略方案
- 综合仓储物流服务合同
- 高中英语:倒装句专项练习(附答案)
- 土地承包经营权长期转让协议
- 成人糖尿病食养指南(2023年版)
- 地方病防治技能理论考核试题
- 四川省高等教育自学考试自考毕业生登记表001汇编
- (2024版)初级茶叶加工工理论知识考试题库(含答案)
- 北京市-实验动物上岗证培训考试题库
- 不锈钢加工及安装合同集合
- 妊娠期高血压用药
评论
0/150
提交评论