STL容器
序列式容器(sequence container):可序但未必有序
- array
- vector:
1.一维数组存储,单向开口,在尾部增添删除数据很快捷。
2.空间不足时,申请max{1,2*opacity()}的空间,复制数据,释放原内存。 - heap
- priority-queue
- list:
1.双向链表实现
2.不可随机访问,因此不能使用algorithm里的sort函数,使用list.sort() - slist 非标准
- deque:
1.多个不连续的数组通过一张索引表(STL称它为map)连成,提供看似连续的接口。双向开口,在头尾增删数据都很快捷。
2.空间不足时,申请新空间,添加到索引表即可。
3.但也因此iterator很复杂,所以尽可能选vector, 对他进行排序等操作时,为了高效一般把它复制到一个vector,再排序,再复制回去。 - stack 适配器
- queue 适配器
关联式容器(associated container)
- RB-tree 非公开
- set
- map
- multiset
- multimap
- hashtable 非标准
- hash_set 非标准
- hash_map 非标准
- hash_mutilset 非标准
- hash_mutilmap 非标准
这些容器有很多是衍生关系,衍生不是派生,而是内含关系。比如heap内含一个vector,priority-queue内含一个heap,stack和queue都内含一个deque,set/map/multiset/multimap都内含一个RB-tree,hash_x都内含一个hashtable
——————————————————————–
vector
function | function |
---|---|
push_back(data) | pop_back() (除去末尾元素) |
size()当前元素个数 | capcity() 当前申请内存能容纳元素的个数 |
resize(n); 将size改变为n,如果原本的size | reserve(n); 如果n |
clear() –清空,size()==0,capcity()不变 | empty() |
front() ,back() 第一个与最后一个数据 | begin(),end()获取相应的iterator |
insert(iterator position,data); isnert(iterator postion, usinged int n, data) 插入到n个data到position前 |
erase(iterator position); erase(iterator first, iterator last) 移除[first,last) |
vector 可使用at(i)随机访问数据
list
function | function |
---|---|
push_front(data), push_back(data) | pop_front(), pop_back() |
size()当前元素个数 | |
clear() –清空 | empty() |
front() ,back() 第一个与最后一个数据 | begin(),end()获取相应的iterator |
insert(iterator position,data); isnert(iterator postion, usinged int n, data) 插入到n个data到position前 |
erase(iterator position); erase(iterator first, iterator last) 移除[first,last) |
remove(data) 遍历 找到就移除 | unique() 遍历一遍,连续相等的数据最后只保留一个,其他移除,所以不保证最后生成是集合 |
list里 基于transfer(非公开函数)的操作
function | 说明 |
---|---|
transfer(iterator position, iterator first, iterator last) | 将[first,last)之间的元素移动到position前。该函数是非公开函数 |
splice | 接合函数 |
sort | 排序函数 |
reverse | 元素顺序取反 |
merge | 有序合并链表 |
int iv[5] = {0, 2, 99, 3, 4};
list<int> ilist(iv, iv + 5);
int iv2[5] = {5, 6, 7, 8, 9};
list<int> ilist2(iv2, iv2 + 5);
list<int>::iterator iter = find(ilist.begin(), ilist.end(), 99);
// 接合操作,把list2接到list的第一个99前
ilist.splice(iter, ilist2); // ilist={0 2 5 6 7 8 9 99 3 4}, ilist2={}
ilist.reserve(); // ilist={4 3 99 9 8 7 6 5 2 0}
/**
* list不能使用STL算法sort,只能使用自己的成员函数sort
* 因为STL算法sort只接受RandomAccessIterator(随机访问迭代器)
* 本函数是quick sort
* */
ilist.sort(); // 排序ilist={0 2 3 4 5 6 7 8 9 99}
int iv[5] = {0, 2, 99, 3, 4};
list<int> list1(iv, iv + 5);
int iv2[5] = {5, 6, 7, 8, 9};
list<int> list2(iv2, iv2 + 5);
list2.sort();
list1.sort();
/**
* merge 将一个list合并到自己上,这两个list事先必须都经过递增排序
*/
list2.merge(list1); // list1={},list2={0 2 3 4 5 6 7 8 9 99}
vector 和 list删除某个元素,都要先遍历一遍,找到元素位置,然后的删除都是常数时间:
swap(vector[position], vector[vector.size()-1]; vector.pop_back() // 现将元素换到最后一个,再删除最后一个。
list更不用说了
iterator
operator | 作用 |
---|---|
==, != | 判断是否为同一个位置的iterator |
++, – | 前后移动 |
* | 获得该位置的数据 |
stack and queue
/**
* 1.STL中的queue和stack都是通过集成其他的数据结构,基于他们的功能提供自己的功能,
* 也就是没有单独的实现的数据结构,这种被称为(adapter)适配器
* 2.我们可以选用他基于的数据结构,默认是deque
* 3.两者都没有iterator
*/
stack<int> deque_stack;
stack<int, vector<int>> vector_stack;
stack<int, list<int>> list_stack;
queue<int> deque_queue;
queue<int, vector<int>> vector_queue;
queue<int, list<int>> list_queue;
algorithm 提供find和sort之类的函数
function | 说明 | 实例 |
---|---|---|
find(iterator first, iterator last, data) | 返回相应的iterator,常常和container.insert联合使用 | vector::iterator iterator1 = find(v.begin(), v.end(), data); |
参考 《STL源码剖析》