STL之算法实现

Posted xcb-1024day

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);    //将相对数值转换为绝对数值

以上是关于STL之算法实现的主要内容,如果未能解决你的问题,请参考以下文章

STL next_permutation 算法原理和自行实现

STL常用算法的使用与实现举例

STL常用算法的使用与实现举例

浅谈 C++之 STL

STL 之 list源码自行实现(iterator)

算法复习之排序