//所有容器都有的
size();
empty();
clear();//队列没有
一、vector 变长数组
1、vector要尽量减少申请空间的次数,,不够的时候就直接变成两倍。
//初始化
vector<int> a;//10个3
vector<int>a[10];//10个vector
//遍历
//for (auto x:a)cout<<x<<endl;
//添加数据
for(int i=0;i<10;i++)
a.push_back(i);
//迭代器
for(vector<int>::iterator i=a.begin();i!=a.end();i++)
cout<<*i<<endl;
for(auto x:a)cout<<x<<endl;
//vector数组的第一个数和最后一个数
cout<<a.front()<<endl;
cout<<a.back()<<endl;
//支持比较运算
vector<int> a(4,3);
vector<int>b(3,4);
if(a<b)puts("a<b");
二、pair 二元组
支持比较运算:以first为第一元素,second为第二元素
//定义与初始化
pair<int,string>p;
p=make_pair(10,"xxx");
p={20,"aaa"};
三、string 字符串
string s="1234";
cout<<s.substr(1,2)<<endl;//返回从下标1开始的长度为2的子串
cout<<s.substr(1)<<endl; //返回从下标1开始的整个子串
printf("%s\n",s);//不能正常输出
printf("%s\n",s.c_str());//可以正常输出
s.clear();
四、queue 队列
queue<int>q;
//队列没有clear清空方法
q=queue<int>();
for(int i=0;i<10;i++)
{
q.push(i);//添加队尾
}
q.pop();//删除队头
cout<<q.front()<<endl;//队头
cout<<q.back()<<endl;//队尾
priority_queue 优先队列
//默认是大顶堆
priority_queue<int>heap;
//同样没有clear函数
for(int i=0;i<10;i++)
{
//q.push(i);
//要想按照小顶堆来排序可以加负号
heap.push(-1*i);
}
heap.pop();
cout<<heap.top()<<endl;//优先队列只能返回队头元素,而且不用front()
//优先队列小根堆的定义方法
priority_queue<int,vector<int>,greater<int>>heap;
for(int i=10;i>=1;i--)heap.push(i);
cout<<heap.top()<<endl;
五、stack 栈
stack<int> stk;
for(int i=0;i<10;i++)stk.push(i);
stk.pop();
cout<<stk.top();
cout<<"一共有"<<stk.size()<<"个元素"<<endl;
五、deque 双端队列
支持队头队尾双端弹入弹出
deque<int>deq;
//队尾插入元素
deq.push_back(1);
cout<<deq.back()<<endl;
//队首插入元素
deq.push_front(2);
cout<<deq.front()<<endl;
//迭代器
for(deque<int>::iterator i=deq.begin();i!=deq.end();i++)
cout<<*i<<" ";
//队首弹出
deq.pop_front();
//队尾弹出
deq.pop_back();
cout<<deq.size()<<endl;
六、set、mutiset、(动态维护序列)
set<int>se;
multiset<int>mse;
for(int i=0;i<10;i++)se.insert(i),mse.insert(i-i);
//注意find的用法
if(se.find(1)!=se.end())cout<<"找到了"<<endl;
//multiset中find用法
if(mse.find(0)!=mse.end())cout<<"找到了"<<endl;
//count erase
cout<<se.count(0)<<endl;
mse.erase(0);
cout<<mse.count(0)<<endl;
set<int>se;
multiset<int>mse;
for(int i=0;i<10;i++)se.insert(i),mse.insert(i-i);
//lower_bound()返回大于等于x的最小的数
cout<<*se.lower_bound(1)<<endl;
cout<<*mse.lower_bound(0)<<endl;
//lower_bound()返回大于x的最小的数
//要先判断是否存在
if(se.upper_bound(9)==se.end())cout<<"没有了"<<endl;
else cout<<*se.upper_bound(9)<<endl;
if(mse.upper_bound(0)==mse.end())cout<<"没有了"<<endl;
else cout<<*mse.upper_bound(0)<<endl;
七、map、multimap
//初始化
map<string,int> a;
//插入
a["zzz"]=1;
a.insert(make_pair("aaa",2));
//可以当数组用 O(log(n))
cout<<a["zzz"];
//lower_bound和upper_bound
cout<<a.lower_bound("zzz")->second<<endl;
//upper_bound
cout<<a.lower_bound("aaa")->second<<endl;
八、undered_set、unordered_map、unordered_multiset、unordered_multimap
增删改查的时间复杂度为O(1),不支持lower_bound和upper_bound操作(内部是没有序的),迭代器的加加减减也是不支持的
九、bitset
用一位代替一字节存储,省内存