目录

​1.max(),min(),abs()​

​2.max_element()和min_element()求数组集合以及结构体中最大最小值​

​3.swap(x,y)  其实不在algorithm里​

​4.reverse()​

​5.next_permutation()​

​6.fill()​

​7.sort()​

​8.lower_bound()和upper_bound()​

​补充:​

​日积月累​

​1.find(begin,end,n)​

​2.求集合交并差​

​3.swap  不需要algorithm头文件 c++ std标准空间中就有​

​4.pow​

​5、transform  string字符串大小写转换​


1.max(),min(),abs()

求x,y,z中的最大值 :max(x,max(y,z))

abs(x)  x只能是int型,要求浮点数绝对值,还是要用cmath下的fabs

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int x=1,y=-2;
cout<<max(x,y)<<" "<<min(x,y)<<endl;
cout<<abs(x)<<" "<<abs(y)<<endl;
return 0;
}

算法笔记6.9 algorithm头文件下常用函数_find

2.max_element()和min_element()求数组集合以及结构体中最大最小值

#include<iostream>
#include<vector>
#include <string>
#include<algorithm>
using namespace std;

struct my
{
string name;
int age;
my(string name,int age){
this->name=name;
this->age=age;
}
my(){}
}My[5];

bool cmp(my m1,my m2){
return m1.age<m2.age;
}


int main(){
int a[12]={89,78,12,0,-88, 977,89,2,3,4, 0,-987};
cout<<"maxA:"<<*max_element(a,a+12)<<endl;
cout<<"minA:"<<*min_element(a,a+12)<<endl;

vector<string> vi;
vi.push_back("c++");
vi.push_back("java");
vi.push_back("c#");
vi.push_back("python");
cout<<"\nmaxV:"<<*max_element(vi.begin(),vi.end())<<endl;
cout<<"minV:"<<*min_element(vi.begin(),vi.end())<<endl;

//结构体求max,min借助vector
My[0]=my("han",10);
My[1]=my("liu",20);
My[2]=my("yang",18);
My[3]=my("tom",25);
My[4]=my("tony",30);
vector<my> vm;
for(int i=0;i<5;i++){
vm.push_back(My[i]);
}
cout<<"\nmaxS:"<<(*max_element(vm.begin(),vm.end(),cmp)).name<<endl;
cout<<"minS:"<<(*min_element(vm.begin(),vm.end(),cmp)).name<<endl;

return 0;
}

算法笔记6.9 algorithm头文件下常用函数_#include_02

3.swap(x,y)  其实不在algorithm里

交换x,y的值

#include<iostream>
using namespace std;
int main(){
int x=1,y=2;
cout<<"x="<<x<<" y="<<y<<endl;
swap(x,y);
cout<<"x="<<x<<" y="<<y<<endl;
return 0;
}

4.reverse()

reverse(it1,it2);反转[it1,it2)内的元素

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main(){
int a[5]={1,2,3,4,5};
for(int i=0;i<5;i++){
cout<<a[i]<<" ";
}
cout<<endl;
reverse(a,a+5);
for(int i=0;i<5;i++){
cout<<a[i]<<" ";
}
cout<<endl;

cout<<endl;
string str="0123456";
cout<<str<<endl;
reverse(str.begin()+2,str.begin()+5);//[2,5)反转2 3 4
cout<<str<<endl;

return 0;
}

算法笔记6.9 algorithm头文件下常用函数_数组_03

5.next_permutation()

给出一个序列在全排列中的下一个序列

123
132
213
231
312
321

则231下一个全排列就是312

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[3]={1,2,3};//初值赋值为123 就能求出全排列
do{
printf("%d %d %d\n", a[0],a[1],a[2]);
}while(next_permutation(a,a+3));
return 0;
}

算法笔记6.9 algorithm头文件下常用函数_#include_04

6.fill()

把数组或者容器内某一段区间赋值为某个相同的值。和memset不同,这里的赋值可以是数组类型对应范围的任何值。

12.memset函数 memset(数组名,值,sizeof(数组名)) (需要#include<string.h>)  memset按字节赋值,每个字节赋一样的值,由于0的二进制补码全为0,-1的二进制补码全为1,初学赋值0,-1不易弄错,赋其他值要用fill函数

eg:memset(a,0,sizeof(a))全部赋值0

13.fill函数   fill(a,a+5,233)数组

a[0]~a[4]均赋值为233  比memset好用,不过效率低一些,且包含在algorithm里

初始化二维数组a[N][N]为k    fill(a[0],a[0]+N*N,k);

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[5]={1,2,3,4,5};
fill(a,a+5,1998);
for(int i=0;i<5;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}

算法笔记6.9 algorithm头文件下常用函数_STL_05

二维数组初始化

#include<bits/stdc++.h>
using namespace std;

const int N=10;
int vis[N][N];

int main(){
fill(vis[0],vis[0]+N*N,10);
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
cout<<vis[i][j]<<" ";
}
cout<<endl;
}
return 0;
}

算法笔记6.9 algorithm头文件下常用函数_#include_06

7.sort()

讲得太多了,写的也很熟悉了,就就写个容器的排序了

vector、string,deque才可以使用sort  因为map,set底层红黑树本来就有序了

容器排序写个容器内元素类型的比较器即可,作为第三个参数,类似结构体排序

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

bool cmp(int a,int b){
return a<b;
}

int main(){
vector<int> vi;
vi.push_back(3);
vi.push_back(1);
vi.push_back(2);
sort(vi.begin(),vi.end(),cmp);
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
cout<<endl;
return 0;
}

算法笔记6.9 algorithm头文件下常用函数_algorithm_07

8.lower_bound()和upper_bound()

lower_bounder(first,last,val):
寻找数组或容器的[first,last)范围内第一个值大于等于val的元素的位置,数组返回指针,容器返回迭代器

upper_bounder(first,last,val):
寻找数组或容器的[first,last)范围内第一个值大于val的元素的位置,数组返回指针,容器返回迭代器

若数组或者容器中没有需要寻找的元素,则返回可以插入该元素的位置或者指针

注意:所操作的数组或者迭代器首先必须是有序的

#include<iostream>
#include<algorithm>
using namespace std;

int a[10]={1,2,2,3,3,3,5,5,5,5};

void findN(int n){
int* lowerPos=lower_bound(a,a+10,n);
int* upperPos=upper_bound(a,a+10,n);
cout<<n<<":"<<lowerPos-a<<" "<<upperPos-a<<endl;
}

int main(){
findN(-1);
findN(1);
findN(3);
findN(4);
findN(6);
return 0;
}

算法笔记6.9 algorithm头文件下常用函数_STL_08

-----------------------------------------------------------------------------------------------------------------------------------------------------------------


补充:

日积月累

1.find(begin,end,n)

从指针范围[begin,end)内查找n,若n存在返回n的地址,否则返回地址end.无法返回下标,可用于普通数组,用于vector时功能强大

样例:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
int num[5]={1,5,6,8,9};
//找到返回地址
cout<<find(num,num+5,9)<<endl;//返回6号元素的地址
cout<<*find(num,num+5,9)<<endl;

//没找到返回最后一个地址的下一个地址
cout<<find(num,num+5,10)<<endl;//返回6号元素的地址

/********************在vector里极其好用********************/
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
cout<<"vector中有:";
for(int i=0;i<vi.size();i++) cout<<vi[i]<<" ";
cout<<endl;
int n;
vector<int>::iterator it;
while(cin>>n){
it=find(vi.begin(),vi.end(),n);//[vi.begin(),vi.end())内找n
if(it!=vi.end()){
cout<<"找到"<<*it<<endl;
}else{
cout<<"未找到"<<endl;
}
}


return 0;
}

算法笔记6.9 algorithm头文件下常用函数_#include_09

判断数组中有无指定元素

#include<iostream>
#include<algorithm>
using namespace std;
//判断一列数中有无指定元素
int main(){
int a[10]={1,3,5,7,9,20,45,-86,-100,-300};
int x;
cout<<"数组a:";
for(int i=0;i<10;i++) cout<<a[i]<<" ";
cout<<endl;
while(cin>>x){
if(find(a,a+10,x)!=a+10){//失败返回最后一个元素地址的下一个地址 否则返回该元素 类似于vector中的!=v.end()
cout<<"有"<<x<<endl;
}else{
cout<<"没有"<<x<<endl;
}
/*//不能这么判断 似乎没有找到就将查找的值x插入第一个查找失败的地址了
if(*find(a,a+10,x)==x){
cout<<"有"<<x<<endl;
}else{
cout<<"没有"<<x<<endl;
}*/
}

return 0;
}

算法笔记6.9 algorithm头文件下常用函数_STL_10

2.求集合交并差

set_union(s1.begin(),s1.end(),s2.begin(),s2.end(),back_inserter(c));//并 

set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),back_inserter(c));//交

set_difference(s1.begin(),s1.end(),s2.begin(),s2.end(),back_inserter(c));//差   s1-s2

结果都在vector  c里面

set集合自带强大API

求集合交并补

#include<iostream>
#include<set>
#include<vector>
using namespace std;
int main(){
set<int> a,b;
vector<int> c;
a.insert(2);a.insert(4);a.insert(6);//2 4 6
b.insert(1);b.insert(2);b.insert(3);b.insert(4);b.insert(5);//1 2 3 4 5
cout<<"a:2 4 6\nb:1 2 3 4 5\n";

//a,b不一定是set,但一定有序
set_union(a.begin(),a.end(),b.begin(),b.end(),back_inserter(c));//并集
cout<<"a并b:";
for(int i=0;i<c.size();i++) cout<<c[i]<<" ";puts("");
c.clear();

//交集
set_intersection(a.begin(),a.end(),b.begin(),b.end(),back_inserter(c));
cout<<"a交b:";
for(int i=0;i<c.size();i++) cout<<c[i]<<" ";puts("");
c.clear();

set_difference(a.begin(),a.end(),b.begin(),b.end(),back_inserter(c));
cout<<"a差b:";
for(int i=0;i<c.size();i++) cout<<c[i]<<" ";puts("");
c.clear();

puts("");
return 0;
}

算法笔记6.9 algorithm头文件下常用函数_#include_11

3.swap  不需要algorithm头文件 c++ std标准空间中就有

string都可以交换

#include<iostream>
using namespace std;
int main(){
int a=1,b=2;
swap(a,b);
cout<<a<<" "<<b<<endl;

char c[3]={'x','y','\0'};
swap(c[0],c[1]);
cout<<c<<endl;

string s1="123",s2="abc";
swap(s1,s2);
cout<<s1<<" "<<s2<<endl;

return 0;
}

算法笔记6.9 algorithm头文件下常用函数_数组_12

4.求数组中一列数字的和以及平均值     accumulate:积累    accumulate(a,a+N,0.0)求和    /N平均值

#include<iostream>
#include<numeric>
using namespace std;
int main(){
const int N=6;
int a[N]={1,2,3,4,5,7};
cout<<22/6.0<<endl;
cout<<accumulate(a,a+6,0.0)/N<<endl;
cout<<22/6<<endl;
cout<<accumulate(a,a+6,0)/N<<endl;
return 0;
}

算法笔记6.9 algorithm头文件下常用函数_find_13

4.pow

c语言函数,不仅可以求乘方,还可以求开方

a的n次方     pow(a,n)
n次根号a     pow(a,1.0/n)

#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<pow(2,10)<<endl;
cout<<pow(1024,1.0/10)<<endl;
cout<<pow(456,0.5);
return 0;
}

算法笔记6.9 algorithm头文件下常用函数_STL_14

5、transform  string字符串大小写转换

c++ string字符串 大小写转换  地址修改,保存在原str中 
transform(str.begin(), str.end(), str.begin(), ::tolower);//->小写 
transform(str.begin(), str.end(), str.begin(), ::toupper);//->大写

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main(){
string str="ABCabc";

transform(str.begin(),str.end(),str.begin(),::tolower);
cout<<str<<endl;

transform(str.begin(),str.end(),str.begin(),::toupper);
cout<<str<<endl;

return 0;
}

算法笔记6.9 algorithm头文件下常用函数_STL_15