STL(三)之算法实现

  • 算法头文件:
#include<algorithm>
#include<numeric>
  • 算法简介:STL算法采用覆盖模式而非安插模式,所以调用者必须保证有足够的操作空间。
  • 函数对象类型声明:元素计数
    • UnaryProc:Op(elem),无返回值
    • CompFunc:Op(elem1,elem2),返回True或者False
    • UnaryPredicate:Op(elem),返回True或者False
    • BinaryPredicate:Op(elem,value),返回True或者False

      非更易型算法

UnaryProc for_each(InputIterator beg,InputIterator end,UnaryProc Op)
difference_type count(InputIterator beg,InputIterator end,const T& val)
difference_type count_if(InputIterator beg,InputIterator end,UnaryProc Op)    
  • 最小值与最大值
ForwardIterator min_element(ForwardIterator beg,ForwardIterator end)
ForwardIterator min_element(ForwardIterator beg,ForwardIterator end,CompFunc Op)
ForwardIterator max_element(ForwardIterator beg,ForwardIterator end)
ForwardIterator max_element(ForwardIterator beg,ForwardIterator end,CompFunc Op)
pair<ForwardIterator,ForwardIterator> minmax_element(ForwardIterator beg,ForwardIterator end)
pair<ForwardIteraror,ForwardIterator> minmax_element(ForwardIterator beg,ForwardIterator end,CompFunc Op)
  • 查找元素
//查找第一个匹配的元素
InputIterator find(InputIterator beg,InputIterator end,const T& value);
InputIterator find_if(InputIterator beg,InputIterator end,UnaryPredicate Op);
InputIterator find_if_not(InputIterator beg,InputIterator end,UnaryPredicate Op);

//查找前n个连续匹配的值
ForwardIterator search_n(ForwardIterator beg,ForwardIterator end,size count,const T& value);
ForwardIterator search_n(ForwardIterator beg,ForwardIterator end,size count,const T& value,BinaryPredicate Op);

//查找第一个子区间
ForwardIterator1 search(ForwardIterator1 beg,ForwardIterator1 end,ForwardIterator2 searchBeg,ForwardIterator2 searchEnd);
ForwardIterator1 search(ForwardIterator1 beg,ForwardIterator1 end,ForwardIterator2 searchBeg,ForwardIterator2 searchEnd,BinaryPredicate Op);

//查找最后一个子区间
ForwardIterator1 find_end(ForwardIterator1 beg,ForwardIterator1 end,ForwardIterator2 searchBeg,ForwardIterator2 searchEnd);
ForwardIterator1 find_end(ForwardIterator1 beg,ForwardIterator1 end,ForwardIterator2 searchBeg,ForwardIterator2 searchEnd,BinaryPredicate Op);

//查找某些元素第一次出现的地点
InputIterator find_first_of(InputIterator beg,InputIterator end,ForwardIterator searchBeg,ForwardIterator searchEnd);
InputIterator find_first_of(InputIterator beg,InputIterator end,ForwardIterator searchBeg,ForwardIterator searchEnd,BinaryPredicate Op);

//查找两个连续且相等的元素
ForwardIterator adjacent_find(ForwardIterator beg,ForwardIterator end);
ForwardIterator adjacent_find(ForwardIterator beg,ForwardIterator end,BinaryPredicate Op);
  • 区间的比较
//验证相等性
bool equal(InputIterator1 beg,InputIterator1 end,InputIterator2 cmpBeg);
bool equal(InputIterator1 beg,InputIterator1,end,InputIterator2 cmpBeg,BinaryPredicate op);

//测试不定序之相等性(数据存在的顺序无所谓)
bool is_permutation(ForwardIterator1 beg,ForwardIterator1 end,ForwardIterator2 beg);
bool id_permutation(ForwardIterator1 beg,ForwardIterator1 end,ForwardIterator2 beg,CompFunc op);

//查找第一次不同
pair<InputIterator1,InputIterator2> mismatch(InputIterator1 beg,InputIterator1,end,InputIterator2 cmpBeg);
pair<Inputiterator1,InputIterator2> mismatch(InputIterator1 beg,InputIterator1,end,Inputiterator2 cmpBeg,CompFunc op);

//检验是否排序
bool is_sorted(ForwardIterator beg,ForwardIterator end);
bool is_sorted(ForwardIterator beg,ForwardIterator end,BinaryPredicate op);
ForwardIterator is_sorted_until(ForwardIterator beg,ForwardIterator end);
ForwardIterator is_sorted_until(ForwardIterator beg,ForwardIterator end,BinaryPredicate op);

//检验是否形成Heap
bool is_heap(RandomAccessIterator beg,RandomAccessIterator end);
bool is_heap(RandomAccessIterator beg,RandomAccessIterator end);
RandomAccessIterator is_heap_until(RandomAccessIterator beg,RandomAccessIterator end);
RandomAccessIterator is_heap_until(RandomAccessIterator beg,RandomAccessIterator end,BinaryPredicate op);

//检验ALL,NONE,ANY
bool all_of(InputIterator beg,InputIterator end,UnaryPredicate op);
bool any_of(InputIterator beg,InputIterator end,UnaryPredicate op);
bool none_of(InputIterator beg,InputIterator end,unaryPredicate op);

更易型算法

//复制元素,返回目标区间第一个未被覆盖的元素
OutputIterator copy(InputIterator sourceBeg,InputIterator sourceEnd,OutputIterator destBeg);
OutputIterator copy_if(InputIterator sourceBeg,InputIterator sourceEnd,OutputIterator destBeg,UnaryPredicate op)
OutputIterator copy_n(InputIterator sourceBeg,Size num,OutputIterator destBeg);
BidirectionalIterator2 copy_backward(BidirectionalIterator1 sourceBeg,BidirectionalIterator1 sourceEnd,BidirectionalIterator2 destEnd);    //反向

//搬移元素
OutputIterator move(InputIterator sourceBeg,InputIterator sourceEnd,OutputIterator destBeg);
BidirectionalIterator2 move_backward(BidirectionalIterator1 sourceBeg,BidirectionIterator1 sourceEnd,BidircectionIterator2,destEnd);//反向

//单序列元素处理并写入目标区间
OutputIterator transform(InputIterator sourceBeg,InputIterator sourceEnd,outputIterator destBeg,UnaryFunc op);

//两序列元素结合并写入目标区间
OutputIterator transform(InputIterator1 sourceBeg,InputIterator1 sourceEnd,InputIterator2 sourceBeg,OutputIterator destBeg,BinaryFunc op);

//元素互换
ForwardIterator2 swap_ranges(ForwardIterator1 beg,ForwardIterator1 end,ForwardIterator2 beg2);

//元素赋值
void fill(ForwardIterator beg,ForwardIterator end,const T& elem);
void fill_n(Forwarditerator beg,Size num,const T& elem);

//替换元素
void replace(ForwardIterator beg,ForwardIterator end,const T& elem,const T& newValue);
void relplace_if(ForwardIterator beg,ForwardIterator end,UnaryPredicate op,const T& value);
OutputIterator replace_copy(InputIterator sourceBeg,InputIterator sourceEnd,OutputIterator destBeg,const T& oldValue,const T& newValue);
OutputIterator replace_copy_if(InputIterator sourceBeg,InputIterator sourceEnd,OutputIterator destBeg,UnaryPreicate op,const T& newValue);
  • 移除型算法
//移除序列内的某些元素
ForwardIterator remove(ForwardIterator beg,ForwardIterator end,const T& value);
ForwardIterator remove_if(ForwardIterator beg,ForwardIterator end,UnaryPredicate op);

//复制时一并移除某些元素
OutputIterator remove_copy(InputIterator sourceBeg,InputIterator sourceEnd,OutputIterator destBeg,const T& elem);
OutputIterator remove_copy_if(InputIterator sourceBeg,InputIterator sourceEnd,OutputIterator destBeg,UnaryPredicate op);

//移除连续重复元素
ForwardIterator unique(ForwardIterator beg,Forwarditerator end);
ForwardIterator unique(ForwardIterator beg,ForwardIterator end,BinaryPredicate op);

//复制过程中移除重复元素
OutputIterator unique_copy(InputIterator sourceBeg,InputIterator sourceBeg,OutputIterator destBeg);
OutputIterator unique_copy(InputIterator sourceBeg,InputIterator sourceEnd,OutputIterator destBeg,BinaryPredicate op);
  • 变序型算法
//反转元素次序
void reverse(BidirectionalIterator beg,BidiectionalIterator end);
void reverse_copy(BidirectionalIterator sourceBeg,BidirectionalIterator sourceEnd,OutputIterator destEnd);

//对容器内的元素重新洗牌
void random_shuffle(RandomAccessIterator beg,RandomIterator end);
  • 排序算法
//对所有元素排序
void sort(RandomAccessIterator beg,RandomAccessIterator end);
void sort(RandomAccessIterator beg,RandomAccessIterator end,BinaryPredicate op);
void stable_sort(RandomAccessIterator beg,RandomAccessIterator end,BinaryPredicate op);
void stable_sort(RandomAccessIterator beg,RandomAccessIterator end,BinaryPredicate op);

//局部排序(将beg到sortEnd的元素排序)
void partial_sort(RandomAccessIterator beg,RandomAccessIterator sortEnd,RandomAccessIterator end);
void partial_sort(RandomAccessIterator beg,RandomAccessIterator sortEnd,RandomSccessIterator end,BinaryPredicate op);

//Heap算法
void make_heap(RandomAccessIterator beg,RandomAccessIterator end);
void make_heap(RandomAccessIterator beg,RandomAccessIterator end,BinaryPredicate op);
void push_heap(RandomAccessIterator beg,RandomAccessIterator end);    //容器先push,heap再push_heap
void push_heap(RandomAccessIterator beg,RandomAccessIterator end,BinaryPredicate op);
void pop_heap(RandomAccessIterator beg,RandomAccessIterator end);    //heap再pop_heap,容器再pop
void pop_heap(RandomAccessIterator beg,RandomAccessIterator end,BinaryPredicate op);
  • 已排序区间算法
//查找元素
bool binary_search(ForwardIterator beg,ForwardIterator end,const T& value);
bool includes(InputIterator1 beg,InputIterator1 end,InputIterator2 searchBeg,InputIterator2 searchEnd);
bool lower_bound(ForwardIterator beg,ForwardIterator end,const T& value);    //返回第一个存在的位置
bool upper_bound(ForwardIterator beg,ForwardIterator end,const T& value);    //返回最后一个存在的位置
pair<ForwardIterator,ForwardIterator> equal_range(ForwardIterator beg,ForwardIterator end,const T& value);    //返回最后一个和第一个可能的位置

//合并元素
OutputIterator merge(InputIterator sourceBeg,InputIterator sourceEnd,InputIterator source2Beg,InputIterator source2End,OutputIterator destBeg);    //合并两个集合的元素,包括汇总,并集,交集的处理
OutputIterator set_union(InputIterator source1Beg,InputIterator source1End,InputIterator source2Beg,InputIterator source2End,OutputIterator destBeg);    //合并两个已排序集合的并集
OutputIterator set_intersection(InputIterator source1Beg,InputIterator source1End,InputIterator source2Beg,InputIterator source2End,OutputIterator destBeg);    //合并两个已排序元素的交集
OutputIterator set_difference(InputIterator source1Beg,InputIterator source1End,InputIterator source2Beg,InputIterator source2End,OutputIterator destBeg);    //合并两个已排序元素的差集
  • 数值算法
T accumulate(InputIterator beg,InputIterator end,T initValue);     //求和
T inner_product(InputIterator1 beg,InputIterator1 end,InputIterator2 beg2,T initvalue);    //求积
OutputIterator partial_sum(InputIterator sourceBeg,InputIterator sourceEnd,OutputIterator destBeg);    //将相对数值转换为绝对数值

原文地址:https://www.cnblogs.com/xcb-1024day/p/11332467.html

时间: 2024-08-30 13:04:33

STL(三)之算法实现的相关文章

C++标准模板库-STL库基本算法

原文链接:http://blog.csdn.net/wangfengwf/article/details/11580989#t9 16.4  STL库基本算法 标准C++STL库中算法组件为一个很重要的组成部分,该组件提供了大多数最常见的通用算法的实现,并且这些实现是经过很多测试试验并被公认在处理上是高效的.将这些最常见的算法通用化实现,最大的优势就是开发者在应用中不需要为具体的常见算法的实现而费神,只需要包含相应的头文件直接使用即可,不仅仅提高的软件开发的效率,同时还有助于软件重用性的提高.

最近公共祖先(三种算法)

最近研究了一下最近公共祖先算法,根据效率和实现方式不同可以分为基本算法.在线算法和离线算法.下面将结合hihocoder上的题目分别讲解这三种算法. 1.基本算法 对于最近公共祖先问题,最容易想到的算法就是从根开始遍历到两个查询的节点,然后记录下这两条路径,两条路径中距离根节点最远的节点就是所要求的公共祖先. 题目参见 #1062 : 最近公共祖先·一 附上AC代码,由于记录的方式采取的是儿子对应父亲,所以实现的时候有点小技巧,就是对第一个节点的路径进行标记,查找第二个节点的路径时一旦发现访问到

Opencv——彩色图像灰度化的三种算法

为了加快处理速度在图像处理算法中,往往需要把彩色图像转换为灰度图像.24为彩色图像每个像素用3个字节表示,每个字节对应着RGB分量的亮度. 当RGB分量值不同时,表现为彩色图像:当RGB分量相同时,变现为灰度图像: 一般来说,转换公式有3中. (1)Gray(i,j)=[R(i,j)+G(i,j)+B(i,j)]/3; (2)Gray(i,j)=0.299*R(i,j)+0.587*G(i,j)+0.144*B(i,j); (3)Gray(i,j)=G(i,j);//从2可以看出G的分量比较大所

Java利用 DES / 3DES / AES 这三种算法分别实现 对称加密

转载请注明出处:http://blog.csdn.net/smartbetter/article/details/54017759 有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了. 2)编程就是算法和数据结构,算法和数据结构是编程的灵魂. 注意,这可不是我说的,是无数程序员总结的,话说的很实在也很精辟,若想长久可持续发展,多研究算法还是很有必要的,今天我给大家说说加密算法中的对称加密算法,并且这里将教会大家对称加密算法的编程使用.包含

快速排序、归并排序、堆排序三种算法性能比较

快速排序.归并排序.堆排序三种排序算法的性能谁最好呢?网上查了一下说快速排序最快.其次是归并排序,最差的是堆排序:而理论上三种排序算法的时间复杂度都是O(nlogn),只不过快速排序最差的会达到O(n^2),但是数据的随机性会消除这一影响,今天就来实际比较一下: 1 #include <iostream> 2 #include<time.h> 3 using namespace std; 4 #define MAX 100000000 5 int data1[MAX],data2[

字符串匹配的三种算法

下面将介绍三种有关字符串匹配的算法,一种是朴素的匹配算法,时间复杂度为O(mn),也就是暴力求解.这种方法比较简单,容易实现.一种是KMP算法,时间复杂度为O(m+n),该算法的主要任务是求模式串的next数组.另外还有一种对KMP算法的改进,主要是求nextval数组. 第一种朴素的匹配算法: int index(char str[], char subStr[]) { int i = 0, j = 0,index = 0; while (str[i] != '\0' && subStr

Java常用三种算法排序比较

Java常用三种算法排序比较 冒泡排序: package demo1; /** * * @author xiaoye 2014-5-13 */ /** * 有N 个数据需要排序,则从第0 个数开始,依次比较第0 和第1 个数据, * 如果第0 个大于第1 个则两者交换,否则什么动作都不做,继续比较第 1 个第2个-, * 这样依次类推,直至所有数据都"冒泡"到数据顶上. 冒泡排序的效率 O(N*N ),比较 N*N/2 ,交换N*N/4 . */ public class Bubble

STL中排序算法的选择

 当大多数程序员需要对一组对象进行排序的时候,首先想到的一个算法是sort.sort是一个非常不错的算法,但它也并非在任何场合下都是完美无缺的.有时候我们并不需要一个完全的排序操作.比如说,如果我们有一个存放Widget的矢量,而我们希望将质量最好的20个Widget送给最重要的顾客,按照顾客的重要程度送上不同质量的Widget,那么只需要排序出前20个最好的Widget,其他的Widget可以不用排序.在这种情况下,需要的是一种部分排序的功能,而有一个名为partial_sort的算法正好

stl非变易算法(二)

这里接着上篇stl非变易算法(一)进行总结.主要解析算法函数count.count_if.mismatch.equal.search.search_n以及find_end,给出算法函数的实现及测试用例.下面直接进入正题. 统计等于某值的容器元素个数count count函数用于计算容器中某个给定值的出现次数.计算迭代区间[first,last)上等于val值的元素个数ret,返回计数. //count算法函数的实现代码 template <class InputIterator, class T

C++ STL 常用遍历算法

C++ STL 常用遍历算法 STL的容器算法迭代器的设计理念 1) STL的容器通过类模板技术,实现数据类型和容器模型的分离 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供了统一性奠定了基 础 3) STL的算法,通过函数对象实现了自定义数据类型的算法运算:所以说:STL的算法也提 供了统一性.                核心思想:其实函数对象本质就是回调函数,回调函数的思想:就是任务的编写者和任务的调用者有效解耦合.函数指针做函数参数.4) 具体例子:transf