一.队列和优先队列
队列是front,back可以访问队首队尾,优先队列用top访问优先级最高
一般优先队列重载小于号,<greater>重载大于号
#include<bits/stdc++.h> using namespace std; int main() { queue<int> q; q.push(1);q.push(2); q=queue<int>();//队列没有clear函数,直接初始化即可清空队列 cout<<q.empty()<<endl; }
#include<iostream> #include<queue> using namespace std; struct st{ int x; int y; friend bool operator<(const st T1,const st T2) { return T1.x>T2.x; } }; int main() { priority_queue<int,vector<int>,greater<int> > qu; qu.push(2);qu.push(3);qu.push(5); while(!qu.empty()) { cout<<qu.top();//235 qu.pop(); } cout<<endl; priority_queue<st>qq; st t1,t2; t1.x=2;t2.x=3; qq.push(t2);qq.push(t1); while(!qq.empty()) { cout<<qq.top().x;//23 qq.pop(); } return 0; }
#include<bits/stdc++.h> using namespace std; struct node{ int id; int val; friend bool operator>(const node T1,const node T2) { return T1.val>T2.val; } }; int main() { priority_queue<node,vector<node>,greater<node>> q; q.push({1,2});q.push({2,3}); cout<<q.top().val;//2 }
二.栈
栈和队列一样没有clear的清空函数,需要循环pop。栈先进后出,访问栈顶的元素用top。其他操作与队列类似。
.size()可以知道元素个数
#include<iostream> #include<stack> using namespace std; int main() { stack<int> s; s.push(2);s.push(3);s.push(4); cout<<s.size()<<endl;//3 while(!s.empty()) { cout<<s.top();//432 s.pop(); } return 0; }
三.向量(动态数组)
vector可以用下标访问
二维vector的用法,当v=[[],[]]时,v.empty()==0,v[0].empty()=1;当v=[]时,v.empty()==1
vector可以用比较运算符
vector<int> a={1,2,3}; for(auto x:a) cout<<x<<' '; puts(""); vector<int> b=a; for(auto x:b) cout<<x<<' '; puts(""); vector<int> c(4); for(auto x:c) cout<<x<<' '; puts(""); vector<int> d(4,2); for(auto x:d) cout<<x<<' '; puts(""); vector<int> e(a.begin(),a.begin()+2);//左闭右开 for(auto x:e) cout<<x<<' '; puts(""); int n=1,m=3; vector<vector<bool>> st(n,vector<bool>(m,false)); //开创一个n*m的二维st数组
#include<bits/stdc++.h> using namespace std; int main() { const int M=3,N=5; vector<vector<int>>v(N); for(int i=0;i<v.size();++i) { v[i].resize(M); } for(int i=0;i<N;++i) for(int j=0;j<M;++j) v[i][j]=i*10+j; v[2].erase(v[2].begin()); v[2].erase(v[2].begin()+1); v[2].erase(v[2].begin()); cout<<v.size()<<endl;//5 cout<<v[2].size()<<endl;//0 cout<<v[2].empty();//1 }
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { vector<int> v; v.push_back(2);v.push_back(6);v.push_back(8); cout<<v.size()<<endl;//3 cout<<v.front();cout<<v.back()<<endl;//28 reverse(v.begin(),v.end()); //v.end()是尾地址加一类似于sort for(int i=0;i<3;++i) cout<<v[i];//862 cout<<endl; v.pop_back(); cout<<v.front()<<endl;//8 v.pop_back(); cout<<v.empty()<<endl;//0 v.clear(); cout<<v.empty();//1 return 0; }
#include<bits/stdc++.h> using namespace std; int main() { vector<int> v(4,3),v2(3,4); //v初始是长度为4,每个元素都为3的vector v.push_back(5); for(auto x:v) cout<<x<<' '; //3 3 3 3 5 cout<<endl; cout<<(v<v2)<<'\n';//1 //vector支持字典序比较 return 0; }
四.集合
set是有序,互异的集合,可以在logn时间进行查找,插入,删除等操作。只能用迭代器访问,unordered_set的插查删O(1)的,rbegin()查最大值
set的insert函数返回值是pair对组型。队组的第一个成员是指向欲插入元素的迭代器,第二个成员是一布尔量,表示本次操作是否成功。
multiset的insert函数的返回值是指向所插入元素的迭代器。
#include<bits/stdc++.h> using namespace std; int main() { set<int> s; s.insert(2);s.insert(4);s.insert(3); auto minn=s.begin();//2 auto maxn=s.rbegin();//4 cout<<*minn<<' '<<*maxn; }
#include<bits/stdc++.h> using namespace std; int main() { set<int> s; s.insert(2);s.insert(3);s.insert(4); auto it=s.begin(); for(int i=0;i<3;++i) cout<<*it++<<' '; //2 3 4 cout<<endl; it=s.end(); for(int i=0;i<3;++i) cout<<*--it<<' '; //4 3 2 }
#include<iostream> #include<set> #include<unordered_set> #include<algorithm> using namespace std; int main() { set<int> s;//默认从小到大 multiset<int> s2;//可以重复元素 unordered_set<int> s3;//无序 s3.insert(7);s3.insert(3);s3.insert(6); s2.insert(2);s2.insert(2); s.insert(2);s.insert(7);s.insert(6); cout<<*s.lower_bound(6)<<" "<<*s.upper_bound(6)<<endl; //lower_bound(x)返回的是第一个大于等于x的迭代器 //upper_bound(x)返回的是第一个大于x的迭代器 s.erase(2);//erase的参数可以是地址,也可以是值 cout<<s.count(2)<<endl;//返回元素的个数0 cout<<s2.count(2)<<endl;//2 for(auto it=s3.begin();it!=s3.end();it++) cout<<*it<<" ";//6 7 3 cout<<endl; for(set<int>::iterator it=s.begin();it!=s.end();it++) cout<<*it<<" ";//6 7 cout<<endl; set<int,greater<int> >st; st.insert(3);st.insert(8);st.insert(9); for(set<int,greater<int> >::iterator it=st.begin();it!=st.end();it++) cout<<*it<<" ";//9 8 3 st.clear(); cout<<endl<<st.empty();//1 return 0; }
五.string
string可以用“=”“+”等运算符,可以用“>”">=""<""<=""==""!="
当b数组未被填充时如果用下标不能直接cout<<b;若用insert(pos,n,char)注意形式
transform(s.begin(),s.end(),s.begin(),::tolower); s.erase(unique(s.begin(),s.end()),s.end()); //string的小写转换和去重
#include<bits/stdc++.h> using namespace std; int main() { string a,b(""); getline(cin,a); int n=a.size(); int t=0; for(int i=0;i<n;++i) { char c=a[i]+a[(i+1)%n]; b.insert(t++,1,c); } cout<<b<<endl; }
/*
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a,b("");
getline(cin,a);
int n=a.size();
int t=0;
for(int i=0;i<n;++i)
{
b[i]=a[i]+a[(i+1)%n];
}
for(int i=0;i<n;++i)
cout<<b[i];
}
*/
#include<iostream> #include<map> #include<algorithm> using namespace std; int main() { int a[4]={1,2,3,4}; do { cout<<a[0]<<a[1]<<a[2]<<a[3]<<endl; }while(next_permutation(a,a+4));//找全排列 return 0; }
#include<iostream> #include<cstring> #include<string> #include<algorithm> using namespace std; int main() { string str("This is the world"); string str2; str2 = str.substr(6, 3); cout << str2 << endl; str2 = str.substr(6); cout << str2 << endl; //str2.insert(2,"io"); //str2.insert(2,str2); str2.insert(2, 3, 'i');//第三参不放字符串 cout << str2 << endl; cout << str.find("is") << endl;//找第一次出现的位置 cout << str.find("is", 4) << endl;//从4到结尾第一次出现的位置 string str1("agbdcfe"); sort(str1.begin(), str1.end()); cout << str1 << endl;//abcdefg next_permutation(str1.begin(), str1.end()); cout << str1 << endl;//abcdegf下一个全排列 prev_permutation(str1.begin(), str1.end()); cout << str1 << endl;//abcdefg上一个全排列 return 0; }
#include<bits/stdc++.h> using namespace std; int main() { string str=("bupt"); printf("%s",str.c_str()); //用printf输出string,str.c_str()表示str的首字符地址 return 0; }
六.映射(map)
map是键值对容器,不能修改key,可以修改value,map会根据key自动排序,时间复杂度包括++,--大多都是logn
#include<iostream> #include<map> #include<vector> #include<algorithm> using namespace std; int main() { map<int,string> m; map<string,vector<int>> m1; m1["zhangsan"]=vector<int>{1,2,3,4}; cout<<m1["zhangsan"][3]<<endl;//4 m[1]="zhangsan";//map当数组用的时候时间是logn m[2]="lisi"; m.insert({2,"wangwu"});//若键值已经存在,就不再插入 m.insert({3,"wangwu"}); for(map<int,string>::iterator it=m.begin();it!=m.end();it++) cout<<it->first<<" "<<it->second<<endl; m.erase(2);//erase()里放键值 cout<<m.count(2)<<endl; return 0; }
七.pair和bitset
#include<bitset> #include<iostream> using namespace std; int main() { pair<int,string> p,q; p={3,"zhangsan"}; cout<<p.first<<" "<<p.second<<endl; //c++99不能直接= q=make_pair(4,"lisi"); cout<<q.first<<" "<<q.second<<endl; //pair自带比较运算 cout<<(q>p)<<endl;//先比较第一,再比较第二 bitset<5> a,b; //bitset括号里写长度 //bitset支持所有位运算和==,!=以及[]运算符 //支持count(),返回由多少个一 //any()判断是否有一个一,none()判断是否全为0 //set(),把所有数置成一,set(k,v)--将第k位变成v; //rset(),把所有数置成0 a.set(3); a.reset(2); cout<<(a[2]^a[3])<<endl;//1 cout<<a[2]<<a[3]<<endl;//01 b.set(); cout<<b[0]<<b[1]<<b[2];//111 cout<<endl;cout<<b.count();//5 }
八.unordered_set,unordered_map,unordered_multiset,unordered_map增删改查都为o1
posted on
浙公网安备 33010602011771号