6.常用STL
1.动态数组Vector
1.基本操作
#include
#include
using namespace std;
int main(){
vector<int>vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec[1]=4;
vec.pop_back();
for(int i=0;i<vec.size();i++){
cout<<v[i]<<endl;
}
vec.clear();
return 0;
}
2.存放自定义数据类型
#include
#include
#include
using namespace std;
struct Student{
string name;
int age;
};
int main(){
vector<Student> class1;
Student stu1,stu2;
stu1.name="Adime";
stu2.name="Sada";
stu1.age=19;
stu2.age=28;
class1.push_back(stu1);
class1.push_back(stu2);
return 0;
}
3.二维动态数组
vector<int>a(n);
vector<int>a(n,m);
#include
#include
#include
using namespace std;
int main() {
vector< vector<int> > vec2;
int n,m;
cin>>n>>m;
vec2.resize(n);
for(int i=0; i<n; i++) {
vec2[i].resize(m);
}
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
cin>>vec2[i][j];
}
}
for(int i=0; i<vec2.size(); i++) {
for(int j=0; j<vec2[i].size(); j++) {
cout<<vec2[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
vector< vector<int> > vec2(n,vector<int>(m,0));
2.集合Set
1.基本操作
集合内的元素不重复,自动升序排序
#include
#include
using namespace std;
int main(){
set<int> se;
se.insert(1);
se.insert(1);
se.insert(2);
se.insert(3);
se.insert(4);
se.insert(0);
se.erase(1);
se.erase(5);
if(se.count(2)){
cout<<"2存在."<<endl;
}
set<int>::iterator it;
for(it=se.begin();it!=se.end();it++){
cout<<*it<<" ";
}
se.clear();
return 0;
}
2.存放自定义数据类型
#include
#include
using namespace std;
struct Point{
int x,y;
bool operator<(const Point &rhs) const{
if(x==rhs.x){
return y<rhs.y;
} else{
return x<rhs.x;
}
}
};
int main(){
int n;
cin>>n;
set<Point> v;
for(int i=0;i<n;i++){
Point temp;
cin>>temp.x>>temp.y;
v.insert(temp);
}
for(set<Point>::iterator it=v.begin();it!=v.end();it++){
cout<< it->x <<" "<< it->y <<endl;
}
return 0;
}
3.栈
#include
#include
using namespace std;
int main(){
stack<int> s;
s.push(1);
s.push(2);
s.push(3);
s.pop();
cout<<s.top()<<endl;
if(!s.empty())
cout<<s.size()<<endl;
}
4.队列
#include
#include
using namespace std;
int main(){
queue<int> que;
que.push(1);
que.push(2);
que.push(3);
que.pop();
cout<<que.front()<<endl;
cout<<que.back()<<endl;
if(!que.empty())
cout<<que.size()<<endl;
return 0;
}
5.优先队列 priority_queue
可以用 优先队列 实现堆
priority_queue < 数据类型,底层用什么结构存储数据,比较大小的函数>
STL里面默认用的是 vector. 比较方式默认用 operator<
如果把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大。----降序
注:优先队列没有 q.front() 和 q.back()
#include
#include
using namespace std;
int main(){
int n,x;
cin>>n;
priority_queue<int,vector<int>,greater<int> > q;
for(int i=0;i<n;i++){
cin>>x;
q.push(x);
}
6.映射Map
1.基本操作
#include
#include
#include
#include
using namespace std;
int main() {
map<string,int> dict;
dict.insert(make_pair("Tom",1));
dict.insert(make_pair("Aam",2));
dict.insert(make_pair("IlS",3));
dict["Bia"]=5;
dict["Uia"]=3;
if(dict.count("Tom"))
cout<<"Tom is "<<dict["Tom"]<<endl;
else
cout<<"not find Tom"<<endl;
for(map<string,int>::iterator it=dict.begin(); it!=dict.end(); it++) {
cout<<it->first <<" "<< it->second <<endl;
}
return 0;
}
2.二维map之map套set
#include
#include
#include
#include
using namespace std;
int main() {
map<int,set<string> > s;
s[2].insert("小A");
return 0;
}
~~~
~~~C++
#include
#include
#include
using namespace std;
int main() {
map<int,map<string,int> >info;
int n;
cin>>n;
for(int i=0;i<n;i++){
int class_id;
string name;
cin>>class_id>>name;
info[class_id][name]++;
}
for(map<int,map<string,int > >::iterator it1=info.begin();it1!=info.end();it1++){
for(map<string,int>::iterator it2=it1->second.begin();it2!=it1->second.end();it2++)
cout<<"There are "<<it2->second<<" people named "<<it2->first<<" in class "<<it1->first<<endl;
}
return 0;
}
7.STL练习
#include
#include
using namespace std;
vector<int> mat[10005];
int main(){
int n,m,x,y;
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>x>>y;
mat[x].push_back(y);
}
for(int i=1;i<=n;i++){
for(int j=0;j<mat[i].size();j++){
cout<<mat[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
1.蒜头君堆积木问题 题目链接
#include
#include
#include
using namespace std;
vector<int> v[10005];
int main() {
int n,m,a,b;
cin>>n>>m;
for(int i=1; i<=n; i++) {
v[i].push_back(i);
}
for(int i=0; i<m; i++) {
cin>>a>>b;
if(a==b) {
continue;
}
for(int j=0; j<v[b].size(); j++) {
v[a].push_back(v[b][j]);
}
vector<int>().swap(v[b]);
}
for(int i=1;i<=n;i++){
for(int j=0;j<v[i].size();j++){
cout<<v[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
2.蒜头君的水果店 题目链接
#include
#include
#include
using namespace std;
int main() {
map<string,map<string,int> > mp;
string s1,s2;
int d;
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>s1>>s2>>d;
mp[s2][s1]+=d;
}
for(map<string,map<string,int> >::iterator it1=mp.begin();it1!=mp.end();it1++){
cout<<(it1->first)<<endl;
for(map<string,int>::iterator it2=(it1->second).begin();it2!=(it1->second).end();it2++){
cout<<" |----"<<(it2->first)<<"("<<(it2->second)<<")"<<endl;
}
}
return 0;
}