目录
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;
}
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;
}
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;
}
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.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;
}
二维数组初始化
#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;
}
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;
}
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;
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
补充:
日积月累
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;
}
判断数组中有无指定元素
#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;
}
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;
}
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;
}
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;
}
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;
}
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;
}