概述
头文件algorithm(算法库)中主要提供了一些对容器操作的函数,如排序、搜索、复制、比较等,因此使用频率还是很高的,由于主要是操作容器,所以函数的语法也很类似:
algorithm_name(container.begin(), container.end(), ...);
其中,container.begin()和container.end()分别表示指向容器开头和结尾的迭代器,对于数组来说,则是数组的首地址和尾地址(当然,不一定非得是首和尾,也可以是中间的某个范围)
1. 排序sort
sort函数可以对容器进行排序,其基本语法为
sort(container.begin(), container.end(), compare_function);
例如:
#include <iostream> #include <algorithm> using namespace std; int main() { int a[5] = {2,1,4,3,5}; sort(a,a+5); for(int i:a){ cout<<i<<endl; } }
// 输出为 1 2 3 4 5
也可以对数组中的某一部分进行排序:
#include <iostream> #include <algorithm> using namespace std; int main() { int a[5] = {2,1,4,3,5}; //注意这个地址区间是左闭右开的 sort(a+2,a+5); for(int i:a){ cout<<i<<endl; } }
// 输出为2 1 3 4 5
除此之外,sort还支持传入一个回调函数作为参数来自定义比较规则,该函数在自定义时,最好定义返回类型为bool,两个形参,表示比较的双方。例如,sort默认是升序排列的,我们可以通过改变比较规则来实现降序排列的效果:
#include <iostream> #include <algorithm> using namespace std;
// 自定义比较规则函数 bool f(int i,int j){ return i>j; } int main() { int a[5] = {2,1,4,3,5}; sort(a,a+5,f); for(int i:a){ cout<<i<<endl; } }
// 输出结果为5 4 3 2 1
2. 查找find
find可用于在容器指定范围内查找元素,若能找到,则返回第一个匹配的元素指针,若不能找到,将固定返回container.end()。作用和python中的关键字in比较类似,但用法差异较大。其基本语法为:
auto it = find(container.begin(), container.end(), value);
基本的用法:
#include <iostream> #include <algorithm> using namespace std; int main() { int a[5] = {2,1,4,3,5}; //这里注意返回的是一个指针,同样可以指定查找的范围 int* index = find(a,a+5,3); //这里能找到,所以将输出3,若不能找到,*index会固定输出参数值,但index始终是数组的末尾指针 cout<<*index; }
find常用于判断某个元素是否存在于容器中:
#include <iostream> #include <algorithm> using namespace std; int main() { int a[5] = {2,1,4,3,5}; int* index = find(a,a+5,6); if(index!=a+5){ cout<<"该元素在数组中"<<endl; } else{ cout<<"该元素不在数组中"<<endl; } } // 输出结果为: 该元素不在数组中
3. 复制copy
copy用于将容器中指定范围内的元素复制到另一个容器中,这里的拷贝是浅拷贝,也就是只拷贝值,不拷贝引用,其基本语法为:
copy(source_begin, source_end, destination_begin);
source表示源容器,destination表示目标容器
#include <iostream> #include <algorithm> using namespace std; int main() { int a[5] = {2,1,4,3,5}; int b[8] = {1,1,1,1,1,1,1,1}; /** 复制的时候要注意: 若源数据的个数多于b的容量,则会报错 若源数据的个数小于等于b的容量,则会从b的头部开始替换元素 **/ copy(a,a+5,b); for(int i:b){ cout<<i<<" "; } } // 输出结果为:2 1 4 3 5 1 1 1
需要注意的是,像数组和vector这种不同的数据结构,因为底层的存储逻辑是有区别的,所以不能相互复制。
4. 比较equal
如果有两个数组,a[5]={1,2,3,4,5},b[5]={1,2,3,4,5},如果我们想判断这两个数组中的元素是否相等,直接写a==b当然是不行的,因为这样比较的是两个数组的地址,结果一定是假。如果要比较两个容器中或两个范围内的元素是否相等,就需要使用equal函数,其基本语法为:
bool result = equal(first1, last1, first2, compare_function);
仔细观察可以发现,没有传第二个范围的终止值,因为这里会自动地取和第一个范围相同的长度。
#include <iostream> #include <algorithm> using namespace std; int main() { int a[5] = {1,2,3,4,5}; int b[5] = {1,2,3,4,5}; //cout<<(a==b)输出结果是0 bool result = equal(a,a+5,b); cout<<result<<endl; } // 输出结果为1
既然在用法中说明了,可以用于两个范围,所以也可以判断同一个容器中两个范围内的元素是否相等
#include <iostream> #include <algorithm> using namespace std; int main() { int a[6] = {1,2,3,1,2,3}; bool result = equal(a,a+3,a+3); cout<<result<<endl; } // 输出结果仍然为1
注意到,和sort一样,equal函数也支持传入一个回调函数,用于自定义“相等”的规则
#include <iostream> #include <algorithm> using namespace std; bool f(int i,char j){ // 数字字符和整数,视为相等 return i==int(j)-48; } int main() { int a[5] = {1,2,3,4,5}; char b[5] = {'1','2','3','4','5'}; // 调用自定义的比较规则 bool result = equal(a,a+5,b,f); cout<<result<<endl; } // 输出结果为1
标签:std,头文件,cout,int,简介,C++,container,using,include From: https://www.cnblogs.com/haruyuki/p/18391434