STL C++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector、list、deque等。其中vector表示一段连续的内存地址,基于数组的实现,list表示非连续的内存,基于链表实现。deque与vector类似,但是对于首元素提供删除和插入的双向支持。关联容器主要有map和set。map是key-value形式的,set是单值。map和set只能存放唯一的key值,multimap和multiset可以存放多个相同的key值。
容器类自动申请和释放内存,我们无需new和delete操作。
vector
一段连续的内存地址,基于数组的实现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
31
32
33
34
35
36
//1. 定义和初始化
vector<int> vec1; 默认初始化,vec1为空
vector<int> vec2(vec1); //使用vec1初始化vec2
vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2
vector<int> vec4(10); //10个值为0的元素
vector<int> vec5(10,4); //10个值为4的元素
//add/remove
vec1.push_back(int) //尾部添加元素
vec1.insert(vec1.end(),5,3); //从vec1.back位置插入5个值为3的元素
vec1.pop_back(); //删除末尾元素
vec1.erase(vec1.begin(),vec1.begin()+2);//删除vec1[0]-vec1[2]之间的元素,不包括vec1[2]其他元素前移
vector<int>::iterator iter = vec1.begin(); //获取迭代器首地址
vector<int>::const_iterator c_iter = vec1.begin(); //获取const类型迭代器
vec1.clear(); //清空元素
//2. check, compare and size
vec1.size()
vec1.empty()
(vec1==vec2)
//3. read/write
vec1[0]
//4. 遍历
int length = vec1.size(); //下标法
for(int i=0;i<length;i++) {
cout<<vec1[i];
}
vector<int>::iterator iter = vec1.begin(); //迭代器法
for(;iter != vec1.end();iter++) {
cout<<*iter;
}
#deque
deque与vector类似,但是对于首元素提供删除和插入的双向支持
deque还支持从开始端插入数据:push_front。其余的类似vector操作方法的使用.
list
表示非连续的内存,基于链表实现
1 |
|
map<K, V>
key-value形式的,对于迭代器来说,可以修改实值,而不能修改key。map会根据key自动排序.
1 |
|
set
set的含义是集合,它是一个有序的容器,里面的元素都是排序好的支持插入、删除、查找等操作,就像一个集合一样,所有的操作都是严格在logn时间内完成,效率非常高。set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同,set默认是自动排序的,使用方法类似list。