The second part of the STL
目录
string
string 的构造
#include<bits/stdc++.h>
//#include<string>
using namespace std;
int main()
{
string str1="hello";
string str2("world");//构造方法
//构造方法还有很多,这里只介绍这几个
cout<<str1+str2<<endl;
cout<<str2+str1<<endl;
return 0;
}
string 比较大小
#include<bits/stdc++.h>
//#include<string>
using namespace std;
int main()
{
vector<string>str;
string str1="hello";
string str2("world");
//字符串也可以进行大小比较
//按照字符序
//看例子
str.push_back(str1);
str.push_back(str2);
string str3="aaaa";
cout<<(str1>str3)<<endl;
str.push_back(str3);
sort(str.begin(),str.end());//排序
cout<<"排序好的:"<<endl;
for(int i=0;i<str.size();i++)
cout<<i<<" "<<str[i]<<endl;
return 0;
}
string 长度判断以及遍历
#include<bits/stdc++.h>
//#include<string>
using namespace std;
int main()
{
string str1="hello";
string str2("world");
string st="";
cout<<"st为空的吗?"<<st.empty()<<endl;//判断是否为空
cout<<"hello长度:"<<str1.length()<<endl;//返回string的长度
for(int i=0;i<str2.size();i++)
printf("%c\n",str2[i]);
return 0;
}
string 三个常用的函数
#include<bits/stdc++.h>
//#include<string>
using namespace std;
int main()
{
string str1="hello";
string str2("world");
string s=str1+str2;
cout<<s<<endl;
cout<<s.find("low")<<endl;//返回找到的下标
//找不到返回string::npos
s.erase(0,3);//删除0开始长度为3的字符串
cout<<s<<endl;
cout<<s.substr(0,3)<<endl;//取0开始长度为3的子字符串
return 0;
}//还有好多不常用的函数,有兴趣自己看
priority_queue
优先队列基本使用
#include<bits/stdc++.h>
//#include<queue>
using namespace std;
struct node{
int x,y;
node(){}
node(int x,int y):x(x),y(y){}
friend operator <(const node &a,const node &b)
{
return a.x<b.x;
}
};
int main()
{
priority_queue<int,vector<int>,less <int> > q1;//greater<int>
priority_queue<int>q2;
priority_queue<node>q3;//很常用
q2.push(5);
q2.push(4);
q2.push(3);
q2.push(6);
q2.push(2);//压到优先队列
cout<<q2.size()<<endl;//大小
while(!q2.empty())//判断是否为空
{
printf("%d\n",q2.top());//优先队列队首
q2.pop();//弹出
}
return 0;
}
结构体优先队列
#include<bits/stdc++.h>
//#include<queue>
using namespace std;
struct node{
int x,y;
node(){}
node(int x,int y):x(x),y(y){}
friend operator <(const node &a,const node &b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
};
int main()
{
priority_queue<int,vector<int>,less <int> > q1;//greater<int>
priority_queue<int>q2;
priority_queue<node>q3;//很常用
q3.push(node(1,2));
q3.push(node(1,3));
q3.push(node(1,1));
q3.push(node(2,3));
q3.push(node(0,2));
cout<<q3.size()<<endl;//大小
while(!q3.empty())//判断是否为空
{
printf("%d %d\n",q3.top().x,q3.top().y);//优先队列队首
q3.pop();//弹出
}
return 0;
}
Pair
pair的基本用法
#include<bits/stdc++.h>
//#include <utility> pair位置
using namespace std;
pair<int,int>p;
int main()
{
p=make_pair(1,2);
cout<<(p.first)<<" "<<(p.second)<<endl;
p=pair<int,int>(3,4);
cout<<(p.first)<<" "<<(p.second)<<endl;
//pair类似于有两个变量的结构体
}
Set
set的基本用法
#include<bits/stdc++.h>
//#include <set>
using namespace std;
set<int>s;
set<int>::iterator it;//迭代器 可理解为类似于指针的东西
int main()
{
s.insert(12);//将数添加到集合
s.insert(13);
s.insert(15);
s.insert(10);
s.insert(15);//set自动排序 自动去重
for(it=s.begin();it!=s.end();it++)//遍历一遍
{
printf("%d\n",*it);
}
}
set的常用的函数
#include<bits/stdc++.h>
using namespace std;
set<int>s;
set<int>::iterator it;//迭代器 可理解为类似于指针的东西
int main()
{
s.insert(12);
s.insert(13);
s.insert(15);
s.insert(10);
s.insert(15);//set自动排序 自动去重
cout<<s.count(15)<<endl;
//15的数量 为1
//可以判断某个元素是不是在这个集合里面
//复杂度 log n
cout<<s.size()<<endl;//集合里面有多少
s.erase(15);//删掉这个数
cout<<s.size()<<endl;
s.clear();
s.empty()?printf("1"):printf("0");
}
multiset
multiset基本用法
#include<bits/stdc++.h>
using namespace std;
multiset<pair<int,int> >s;//不去重
multiset<pair<int,int> >::iterator it;//迭代器 可理解为类似于指针的东西
int main()
{
s.insert(make_pair(6,2));
s.insert(make_pair(1,2));
s.insert(make_pair(1,2));//不去重
s.insert(make_pair(2,2));
s.insert(make_pair(0,3));
s.insert(make_pair(0,5));
cout<<s.count(make_pair(1,2))<<endl;//log n
for(it=s.begin();it!=s.end();it++)//遍历一遍
{
printf("%d %d\n",(*it).first,(*it).second);
}
}
Map
map构造方式
#include<bits/stdc++.h>
//#include<map>
using namespace std;
map<string,int>mp;//类似于字典
map<string,int>::iterator it;//每个string 对应一个int
int main()
{
mp["a"]=12;
mp["po"]=13;
mp["cc"]=13;
mp["cc"]=16;
mp["dc"]=16;//排序并且去重
mp.insert(make_pair("hhh",89));
for(it=mp.begin();it!=mp.end();it++)//遍历
{
cout<<(it->first)<<" "<<(it->second)<<endl;
}
}
map的一些函数
#include<bits/stdc++.h>
//#include<map>
using namespace std;
map<string,int>mp;//类似于字典
map<string,int>::iterator it;//每个string 对应一个int
int main()
{
mp["a"]=12;
mp["po"]=13;
mp["cc"]=13;
mp["cc"]=16;
mp["dc"]=16;//排序并且去重
mp.insert(make_pair("hhh",89));
cout<<mp.size()<<endl;
mp.erase("cc");//删
cout<<mp.size()<<endl;
cout<<mp.count("po")<<endl;
cout<<((mp.find("a"))->second);//mp.find("a")返回a的迭代器
mp.clear();
}
multimap
multimap的简单使用
#include<bits/stdc++.h>
//#include<map>乱搞了一个就是字典中的一个可以对应多个,
using namespace std;
struct tem1{
int x,y,z;
tem1(){}
tem1(int x,int y,int z):x(x),y(y),z(z){}
friend operator <(const tem1 &a,const tem1 &b)
{
return a.x<b.x;
}
};
struct tem2{
int u,v;
tem2(){}
tem2(int x,int y){u=x,v=y;}
};
multimap<tem1,tem2>mp;
multimap<tem1,tem2>::iterator it;
int main()
{
mp.insert(make_pair(tem1(1,1,1),tem2(1,1)));//只能insert
mp.insert(make_pair(tem1(1,1,1),tem2(3,6)));
mp.insert(make_pair(tem1(9,8,5),tem2(1,1)));
mp.insert(make_pair(tem1(6,1,1),tem2(1,1)));
for(it=mp.begin();it!=mp.end();it++)
{
printf("%d",(*it).first.x);
printf("\n");
}
}
Bitset
bitset构造
#include<bits/stdc++.h>
#include<bitset>
using namespace std;
int main()
{
string s="1001";
bitset<32>f(s);
bitset<32>g(65535);
cout<<f<<endl<<g<<endl;
}
bitset运算
bitset的运算就像一个普通的整数一样,可以进行与(&)、或(|)、异或(^)、左移(<<)、右移(>>)等操作。
#include<bits/stdc++.h>
#include<bitset>
using namespace std;
int main()
{
string s="1001";
bitset<32>f(s);
bitset<32>g(65535);
cout<<f<<endl<<g<<endl;
cout<<(f&g)<<" f&g"<<endl;
cout<<(f<<1)<<" f<<1"<<endl;
cout<<g.count();
}
Unordered__map
简单例子
#include<bits/stdc++.h>
//#include<map>
using namespace std;
unordered_map<string,int>mp;//类似于字典
unordered_map<string,int>::iterator it;//每个string 对应一个int
int main()
{
mp["a"]=12;
mp["po"]=13;
mp["cc"]=65;
mp["cc"]=16;
mp["dc"]=16;//排序并且去重
mp.insert(make_pair("hhh",89));
cout<<mp["cc"]<<endl;//如果是map需要o(log(n)) unordered__map只要o(1)
}