系统为某一个程序分配空间时,所需时间基本与空间大小无关,与申请次数有关
例 vector最开始就分配了32位空间 不够时再申请64的空间 将之前的copy过来
实际上是一个倍增的思想

[vector与pair] [c++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
vector<int> a(10); //定义长度为10的vector
vector<int> b(10,3); //长度为10且初始化为3的vector

a.size();//a元素个数 所有容器都有 时间复杂度O(1)
a.empty();//返回是否为空
a.clear(); //清空 注意队列没有clear
a.front();//首位
a.back();//末位
push_back(); //末尾添加
pop_back(); //删掉最后一个数
a.erase(a.begin()+2); //删除第3个元素
a.insert(a.begin()+i,b); //在第i+1个元素前面插入b;
begin() end() //迭代器 前者就是a[0] 后者是最后一个数后面的一个数a[a.size]
[] //可以和数组一样

//推荐的遍历方式
1. for(int i=0;i<a.size;i++) cout<<a[i];
2. for(auto x:a) cout<<x;

//常用于多属性 排序 等于一个结构体
pair<int string> p; //定义 中间两个类型参考要求

//也可以存三个属性
pair<int,pair<int,int>>p2;

p.first; //一对pair中第一个元素
p.second;
p={20,"abc"};


用字符数组存不方便 string方便

[string] [c++]
1
2
3
4
5
6
string a="abc";
a+="def"; //可以直接这么加

string b=a.substr(1,2); //从下标为1的元素开始截取长度为2的字串 此处就是bc
//如果长度超过了 那么就输出到最后一个字符为止

queue 队列 先进先出

[队列] [c++]
1
2
3
4
5
6
7
8
9
queue 队列
push() 队尾插入
pop() 弹出队头元素
front()
back()
//注意没有队列clear函数 可以直接
queue<int>q;
q=queue<int>();

priority queue 优先队列 就是堆

[优先队列] [c++]
1
2
3
4
5
6
priority_queue<int> heap; //一定要注意 优先队列默认大根堆

heap.push(-x); // 想弄小根堆 都插负数就行了
priority_queue<int,vector<int>,greater<int> >q1; //或者这样


栈和之前的基本一致 该有的都有

[栈] [c++]
1
2
3
4
5
push() //向栈顶插入一个元素
top() //返回栈顶元素
pop() //弹出栈顶元素
size...empty...

双端队列deque 之前没怎么见过
是一种在两端均可以扩展或者收缩的序列化容器 可以在头部和尾部进行插入和删除操作
就是个升级版vector 缺点是速度较慢

[deque] [c++]
1
2
3
4
size..empty...clear...
push_back()/pop_back()
push_front()/pop_front() //头尾插入删除

有时可能出现需要去掉重复元素的情况 而且有可能因这些元素比较大或者类型不是int型而不能直接开散列表 在这种情况下就可以用set来保留元素本身而不考虑它的个数
就相当于集合

[set/multiset] [c++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
set<int>S; //set里不会有重复元素 插入重复元素的操作会被忽略
multiset<int>Q; //可以有重复元素
size()..empty()
insert() //插入
find() 查找一个数 不存在返回end迭代器
count() 返回某个数的个数
erase()
(1) 输入一个数x 删除所有x O(k+logn)
(2) 输入一个迭代器,删除这个迭代器(针对有重复元素的multiset)
lower_bound(x) 返回大于等于x的最小的数的迭代器
upper_bound(x) 返回大于x的最小的数的迭代器 如果没有返回end迭代器
例子
int a[] = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4};
cout << (lower_bound(a, a + 12, 4) - a) << endl;//输出9即第一个大于等于4的数的下标

map参考stl.map