C++算法库,c++算法题库
文章中常见的库算法1.1头文件1.2复制函数(带模板)1.3相等函数(带模板)1.4变换函数(带模板)1.5累加函数(带模板)1.6 remove_copy_if函数(带模板)1.7 r E _ if函数(带模板)1.8分区函数和stable_partition函数(带模板)1.9 find_if函数(带模板)1.10搜索函数(带模板)1.11唯一函数1.12距离函数1.13 rot Ate 2
1常用的库算法
1.1头文件除非特别说明,以下函数的头文件都是算法。
1.2复制功能(带模板)模板代码:
模板类输入,类输出
输出副本(输入开始,输入结束,输出目标){
while(开始!=结束)
* dest=* begin
返回目的地;
}通用算法(不属于任何特定容器的算法)。
复制(开始、结束、输出);这三个参数都是迭代器。
将区间[begin,end]中迭代器的所有元素复制到从一系列one-out开始的元素中,必要时展开out所属的容器。
一般back_inserter (container)常用于out,back_inserter是迭代适配器。
Back_inserter一般以容器为参数,产生一个迭代器。当生产迭代器用于目的地时,它会在容器的末尾添加一个值。
上面的代码相当于
while(开始!=end){
* out=* begin
}示例代码:
将向量V的值复制到v2
向量int v;
向量int v2
copy(v.begin(),v.end(),back _ inserter(v2));下面写的不对,但是可以编。错误v2.end()中没有元素。首先要复制的是复制一个值到v2.end(),但是这个位置没有元素,也就是这个元素的地址也不存在。由于不能分配空地址(分配:先删除元素的原始内容,再复制),复制操作无法完成。
向量int v;
向量int v2
copy(v.begin(),v.end(),v2 . end());下面的措辞也是错误的:
向量int v;
向量int v2
copy(v.begin(),v.end(),v2 . begin());
1.3等功能(带模板)模板功能:
模板类输入,类输出
布尔等于(In begin,In end,Out dest){
while(开始!=end){
如果(*begin!=*dest ){
返回false
}
}
返回true
}通话格式
equal(begin1,end,begin 2);第一个和第二个值是第一个序列的开始和结束迭代器,第三个值是第二个序列的起点。
Equal假设第二个序列的长度与第一个序列的长度相同,所以不需要end迭代器。
示例:
判断回文:
bool is _回文(常量字符串s){
return equal(s.begin(),s,end(),s . r begin());
}rbegin()一个迭代器,返回容器最后一个元素的开头。
1.4转换功能(带模板)模板功能:
模板类入、类出、类前
void transform2(In begin,In end,Out dest,Pre f){
while(开始!=end){
* dest=f(* begin);
}
}通话格式:
transform(begin,end,out,func);前两个迭代器是带有转换元素的区间,第三个迭代器是目的地,将保存函数的运行结果。第四个参数是应用于输入序列的每个元素以获得输出序列中相应元素的函数。
示例:
int func(int x){
返回x1;
}
向量int v;
向量整数分辨率;
transform(v.begin()、v.end()、back_inserter(res)、func);
1.5累加功能(带模板)模板功能:
模板类输入,类输出
Out accumulate(In begin,In end,Out dest){
while(开始!=end){
dest=dest * begin
开始;
}
返回目的地;
}使用格式:
累加(begin,end,val);头文件是:
数字的
前两个参数是区间,第三个参数是求和结果的初始值。和的类型是第三个参数的类型。
示例:
连接vector string对象中的所有元素。
向量字符串v={ 我,爱,你 };
字符串str
str=accumulate(v.begin(),v.end(),str);
cout字符串;
1.6 remove_copy_if函数(带模板)模板函数:
模板类入、类出、类前
Out remove_copye_if(In begin,In end,Out dest,Pre f){
while(开始!=end){
如果(!f(*begin)){
* dest=* begin//不满足谓词的元素被复制到开头
}
开始;
}
返回目的地;
}使用格式:
remove_copy_if(begin,end,out,func);前两个迭代器是带有转换元素的区间,第三个迭代器是目的地,将保存函数的运行结果。最后一个是返回bool类型的函数,判断区间内的每个元素。
函数将不满足谓词的元素(不满足条件的函数)复制到out指定的容器中。
示例:
bool func(int x){
返回x 60
}
向量int v;
向量整数分辨率;
//也就是所有通过复制的都复制到RES。
remove_copy_if(v.begin(),v.end(),back_inserter(res),func);
1.7 remove_if函数(带模板)函数模板:
模板类在,类前
In remove_if(In begin,In end,Pre f){
In i=begin
而(我!=end){
如果(!f(*i)){
* begin=* I;//不满足谓词的元素被复制到开头
}
我;
}
返回开始;
}使用格式:
remove_copy_if(begin,end,func);前两个迭代器是带变换元素的区间,第三个迭代器是返回bool类型判断区间中每个元素的函数。
作用是将不满足谓词的元素(不满足条件的函数)复制到序列的开头,返回一个迭代器,指向最后一个不满足条件的元素之后的位置。
示例:
bool func(int x){
返回x 60
}
向量int v;
//删除符合条件的元素(即删除所有不符合条件的元素)
v.erase(remove_if(v.begin(),v.end(),func),v . end());
1.8分区函数和stable_partition函数(带模板)模板函数:
模板类在,类前
In partition(In begin,In end,Pre f){
In i=begin//记录上一部分中满足条件的最后一个元素的位置
while(开始!=end){
If(f(*begin)){//满足条件并与前一个元素交换位置
std:swap(*begin,* I);
}
开始;
}
返回I;
}使用格式:
stable_partition(begin,end,func);前两个迭代器是带变换元素的区间,第三个迭代器是返回bool类型判断区间中每个元素的函数。
该函数将满足谓词(条件函数)的每个元素排在不满足谓词的元素之前。返回第一个不满足谓词的迭代器,如果所有元素都满足谓词,则结束。
分区函数与stable_partition的不同之处在于:
分区可以重新排列每个类别中的元素;Stable_partition不仅划分区域,而且保持每个区域中元素的相互顺序(相对位置)不变。
1.9 find_if函数(带模板)模板函数:
模板类在,类前
In find_if(In begin,In end,Pre f){
while(开始!=结束!f(*begin)){
开始;
}
返回开始;
}使用格式:
find_if(begin,end,func);前两个迭代器是带变换元素的区间,第三个迭代器是返回bool类型判断区间中每个元素的函数。
根据谓词检查区间中的每个元素,如果查找到的值存在,则返回该值在一个序列中第一次出现的迭代器;如果不是,则返回第二个参数。
1.10搜索函数(带模板)模板函数(自己写的,用的算法简单,KMP带nextval可以效果更好)
模板类输入,类输出
搜索中(In begin,In end,Out begin2,Out end2){
在I;
while(开始!=end begin2!=end2){
i=begin//记录文本字符串的开头,开始匹配位置。
Out j=begin2
If(*begin==* begin2){//等式保持回溯。
while(*begin==*begin2 begin!=end begin2!=end2){
开始;
begin2
}
}
//不想等,模式字符串回到开头,文本字符串位置加1。
如果(*begin!=* begin2 begin!=end begin2!=end2){
begin=I;
begin 2=j;
}
}
If(begin2==end2){//完全匹配
返回I;
}否则{
返回结束;
}
}使用格式:
search(begin1,end1,begin2,end 2);参数是两对迭代器,第一对是要查找的序列,第二对指向一个序列(定位这个序列)。
如果搜索失败,则返回第二个参数;如果成功,它将返回序列第一次被发现的位置之前的迭代器。
1.11独特的功能格式:
唯一(开始,结束);两个参数都是迭代器。处理间隔为[开始,结束]。
迭代器用于将重复的元素移到后面,然后返回最后一个不重复该元素的元素的迭代器。
1.12距离函数头文件:迭代器
使用格式:
距离(开始,结束);两个参数都是迭代器。处理间隔为[开始,结束]。
函数的作用是:返回迭代器区间中元素的个数。
1.13旋转函数使用格式:
旋转(begin,begin1,end);三个参数都是迭代器,第一个和第三个参数是区间的开始和结束迭代器,第二个参数必须是这个区间内的迭代器。
函数:以类似循环左移的方式移动区间中的元素,然后移动,直到第二个参数的迭代器成为区间中新的第一个元素。
函数返回原始第一个元素的新位置(新迭代器)。
2.1 sort,remove_if,partition difference sort,remove_if,partition会将基本容器中的元素移动到一个新的位置,但不会改变容器的长度。
例如,remove_if不改变它所操作的容器的长度,而只是复制容器内不同位置的元素。
2.2迭代器适配器概念:是一个生成迭代器的函数。
头文件:
迭代程序
常见:
back _ inserter
角色:在容器c的末尾插入一个元素。
c容器必须支持链表、vector、string类型支持的push_back()操作。
前插入器;
功能:插在容器的头部。
c容器必须支持push_front操作(比如链表)。
插入器(c,it);
角色:在迭代器之前插入一个元素。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。