8. algorithm头文件下的常用函数
8.1 max() min() abs() swap()
swap(x , y)用来交换x和y的值
8.2 reverse()
reverse( it , it2 ) 可以将数组指针在 [ it , it2 )之间的元素或容器的迭代器在 [ it , it2 )范围内的元素进行逆转
int a[10]={10,11,12,13,14,15};
reverse(a,a+4);
如果是对容器内的元素(例如string字符串)进行反转,结果也是一样
string str = "abcdefghi";
reverse(str.begin()+2,str.begin()+6);
8.3 next_permutation()
给出一个序列在全排列中的下一个序列
输出n=3的全排列,123 132 213 231 312 321 int p[10]={1,2,3};
do{
cout<<p[0]<<p[1]<<p[2]<<endl;
}while(next_permutation(p,p+3));
由于next_permutation在已经到达全排列的最后一个时才会返回false,这样方便退出循环,而使用do while语句而不使用while是因为123本身也要输出,如果使用while会直接跳到下一个序列输出
8.4 fill()
fill()可以把数组或容器中的某一段区间赋为某个相同的值,和memset不同,这里的赋值可以使数组类型对应范围中的任意值
int f[5]={1,2,3,4,5};
fill(f,f+5,23333);
8.5 sort()
8.6 lower_bound() upper_bound()
这两个函数需要用在一个有序数组或容器内
lower_bound( first , last , val )用来寻找在顺组或容器的 [ first , last ) 前闭后开区间范围内第一个值大于等于val的元素的位置,如果是数组,则返回该位置的指针,如果是容器,则返回该位置的迭代器
upper_bound( first , last , val )用来寻找在顺组或容器的 [ first , last ) 前闭后开区间范围内第一个值大于val的元素的位置,如果是数组,则返回该位置的指针,如果是容器,则返回该位置的迭代器
如果数组或容器中没有需要寻找的元素,则均返回可以插入该元素的位置的指针或迭代器,复杂度均为O(log(last-first))
如果只是想获得欲查元素的下标,就可以不使用临时指针,而直接令返回值减去数组首地址
9. pair的常见用法
9.1 pair的定义
pair可以看作一个内部有两个元素的结构体,且这两个元素的类型是可以指定的,使用pair,要添加#include<utility>
由于map的内部实现中涉及pair,因此添加map头文件时会自动添加utility头文件
pair有两个参数,分别对应first和second的数据类型,它们可以是任意基本数据类型或容器
pair<typeName1 , typeName2> name;
pair<string,int> p1;
pair<string,int> p2("haha",5); //定义时初始化
如果想要在代码中临时构建一个pair
pair<string,int>("haha",5);
make_pair("haha",5);//使用自带的make_pair函数
9.2 pair中元素的访问
pair<string,int> p;
p.first="haha";
p.second=5;
cout<<p.first<<" "<<p.second<<endl;
p = make_pair("xixi",55);
cout<<p.first<<" "<<p.second<<endl;
p = pair<string,int>("heihei",555);
cout<<p.first<<" "<<p.second<<endl;
9.3 pair常用函数实例
比较操作数:比较规则是先以first的大小作为标准,只有当first相等时才去判断second的大小
9.4 pair的常见用途
(1)用来代替二元结构体及其构造函数,节省编码时间
(2)作为map的键值对来进行插入
map<string,int> mp;
mp.insert(make_pair("heihei",5));
mp.insert(pair<string,int>("haha",10));
for(map<string,int>::iterator it = mp.begin();it!=mp.end();it++){
cout<<it->first<<" "<<it->second<<endl;
}