STL容器简单描述

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源码剖析》

猜你喜欢

转载自blog.csdn.net/yinglang19941010/article/details/52135542