1 | <cstdlib>: abort, |
标准库定义了 100多个算法,要学习如何使用它们,需要理解它们的结构,而不是记住每个算法的细节。
1 | find(beg,end,val); 在迭代区间[begin,end)内查找等于val的元素,找到返回相应的迭代器,否则返回end。 |
1 | find_first_of(beg1,end1,beg2,end2); |
例:vec1 –{1,2,3,4,5}, vec2{3,2,4}, vec3{8,6,7}
在vec1中查找vec2,则返回元素2在vec1中的迭代器。
在vec1中查找vec3,则返回vec1.end()迭代器。
1 | find_end(beg1,end1,beg2,end2); |
例:vec1 –{1,2,3,4,5}, vec2{2,3,4}, vec3{3,2,4}
在vec1中查找vec2,则返回元素2在vec1中的迭代器。
在vec1中查找vec3,则返回vec1.end()迭代器。
1 | adjacent_find(beg,end); |
依次遍历元素,查范围内相邻元素,使用==或unarypred相匹配,若存在,返回第一个元素对应的迭代器,否则返回end.
1 | search(beg1,end1,beg2,end2); |
1 | count(beg,end,val); |
1 | for_each(beg,end,f); |
1 | mismatch(beg1,end1,beg2); |
1 | 判断[beg1,end1)与[beg2,end2)内元素都相等 |
lower_bound( )和upper_bound( )都是利用二分查找
的方法在一个排好序的数组中进行查找的。
1 | lower_bound(beg,end,val); |
返回一对iterator,第一个表示lower_bound,第二个表示upper_bound。
1 | equal_range(beg,end,val); |
在[beg,end)中查找val,找到返回true。
1 | binary_search(beg,end,val); |
1 | fill_n(dest,cnt,val); 将值val赋给[beg,beg+n)范围内的所有元素。 |
连续调用函数func填充[beg,end)范围内的所有元素。
1 | generate_n(dest,cnt,Gen); |
复制[beg,end)到res
1 | copy(beg,end,dest); |
1 | 将[beg,end)范围内所有元素依次调用函数unary,结果放入res中。 |
将[beg,end)内所有等于oval的元素都用nval代替.将结果写入res。
1 | replace_copy(beg,end,dest,old_val,new_val); |
将[beg,end)内所有等于old_val的元素都用nval代替
1 | replace(beg,end,old_val,new_val); |
1 | merge(beg1,end1,beg2,end2,dest); 合并[beg1,end1)与[beg2,end2)存放到res。 |
1 | swap(elem1,elem2); |
合并[beg,mid)与[mid,end),结果覆盖[beg,end)。
1 | inplace_merge(beg,mid,end); |
partial_sort和nth_element只进行部分排序,速度比整体排序算法更快。
1 | stable_partition(beg,end,unaryPred); 与partition()类似,保留容器中的相对顺序。 |
1 | sort(beg,end); 默认升序重新排列元素 |
1 | partial_sort(beg,mid,end); 排序mid-beg个元素。排序后,从beg到mid中的元素都是有序的,mid到end中的元素顺序未指定。 |
单个元素序列重新排序,使所有小于第n个元素的元素都出现在它前面,而大于它的都出现在后面。
1 | nth_element(beg,nth,end); |
1 | 删除[beg,end)内所有等于val的元素。注意,该函数不是真正删除函数。 |
1 | 重排序列,对于相邻的满足条件的元素,通过覆盖来进行删除,返回一个迭代器,指向最后一个保留元素的尾后位置。 |
围绕mid指向的元素进行元素转动。元素mid成为首元素,随后是mid+1->end之间的之前的元素,再接着是beg到mid之前的元素。返回一个迭代器,指向原来beg位置的元素。
1 | rotate(beg,mid,end); |
翻转序列中的元素。reverse返回void,reverse_copy返回一个迭代器,指向拷贝到目的序列的元素的尾后位置。
1 | reverse(beg,end); |
使用随机访问迭代器的重排算法
1 | random_shuffle(beg,end); 元素随机调整次序。 |
这些算法假定序列中的元素都是唯一的。要求双向迭代器。
判断两个序列是否为同一元素集的不同排列
1 | is_permutation(beg1, end1, beg2) |
生成序列的字典序排列中的下一个,返回要给bool指出是否还有下一个
如果序列已经是最后一个排序,则本函数将序列重排为最小的序列,返回false。否则将输入序列转为字典序的下一个排列,返回true。
1 | next_permutation(beg,end); |
1 | int a[6]={1,2,3,4,5,6}; |
生成序列的字典序排列中的前一个,返回要给bool指出是否还有前一个。
若序列已经是第一个排序,则本函数将序列重排为最大的序列,返回false。否则将序列转为字典序的上一个排序,返回true。
1 | prev_permutation(beg,end); |
判断[beg1,end1)是否包含[beg2,end2),使用底层元素的<操作符,成功返回true。重载版本使用用户输入的函数。
1 | includes(beg,end,beg2,end2); |
取[beg1,end1)与[beg2,end2)元素并集存放到dest。
1 | set_union(beg,end,beg2,end2,dest); |
取[beg1,end1)与[beg2,end2)元素交集存放到res。
1 | set_intersection(beg,end,beg2,end2,dest); |
取[beg1,end1)与[beg2,end2)元素内差集存放到res。
1 | set_difference(beg,end,beg2,end2,dest); |
取[beg1,end1)与[beg2,end2)元素外差集存放到res。
1 | set_symmetric_difference(beg,end,beg2,end2,dest); |
1 | min(va1,va2); 返回两个元素中较小一个。 |
1 | min_element(beg,end); 返回一个ForwardIterator,指出[beg,end)中最大的元素。 |
1 | lexicographical_compare(beg1,end1,beg2,end2); 按字典序判断[beg1,end1)是否小于[beg2,end2) |
1 | 对[beg,end)内元素之和,加到初始值val上。 |
1 | 将[beg,end)内该位置前所有元素之和放进dest中。 |
1 | 对两个序列做内积(对应元素相乘,再求和)并将内积加到初始值init上。 |
将新序列写入dest,每个新元素(除了首元素)的值都为输入范围中当前位置和前一个位置元素之差。第一个版本使用-,第二个版本使用binaryOp。
1 | adjacent_difference(beg,end,dest); |
C++ primer 附录
C++ STL 常见算法(比较详细)
C++进阶:STL算法总结
C/C++基础—算法概览
关于lower_bound( )和upper_bound( )的常见用法
Update your browser to view this website correctly. Update my browser now