转自:http://blog.csdn.net/hackbuteer1/article/details/6791260
作者:Hackbuteer1
本文主要讨论C++标准库中的顺序容器及相应的容器适配器,这些内容主要涉及顺序容器类型:vector、list、deque,顺序容器适配器类型:stack、queue、priority_queue。
标准库中的容器分为顺序容器和关联容器。顺序容器(sequential container)内的元素按其位置存储和访问,顾名思义,这些内部元素是顺序存放的;顺序容器内的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。而关联容器的元素按键(key)排序。标准容器类 | 说明 |
顺序性容器 | |
vector | 从后面快速的插入与删除,直接访问任何元素 |
deque | 从前面或后面快速的插入与删除,直接访问任何元素 |
list | 双链表,从任何地方快速插入与删除 |
关联容器 | |
set | 快速查找,不允许重复值 |
multiset | 快速查找,允许重复值 |
map | 一对多映射,基于关键字快速查找,不允许重复值 |
multimap | 一对多映射,基于关键字快速查找,允许重复值 |
容器适配器 | |
stack | 后进先出 |
queue | 先进先出 |
priority_queue | 最高优先级元素总是第一个出列 |
容器类型
vector | 容器,支持快速随机访问(连续存储) |
list | 链表,支持快速插入/删除 |
deque | 双端队列,支持随机访问(连续存储),两端能快速插入和删除 |
stack | 栈 |
queue | 队列 |
priority_queue | 优先级队列 |
*iter | 返回类型iter所指向的元素的引用 |
iter->mem | 对iter进行解引用,并取得指定成员 |
++iter | 给iter加1,使其指向容器中下一个元素 |
iter++ | |
--iter | 给iter减1,使其指向容器中前一个元素 |
iter-- | |
iter1 == iter2 | 当两个迭代器指向同一个容器中的同一元素,或者当它们都指向 |
iter1 != iter2 | 同一个容器的超出末端的下一个位置时,两个迭代器相等。 |
iter + n | 在迭代器上加(减)整数值,将产生指向容器中前面(后面)第n个元素的迭代器; |
iter - n | 新计算出来的迭代器必须指向容器中的元素或超出容器末端的下一位置。 |
iter1 += iter2 | 复合运算:先加(减),再赋值 |
iter1 -= iter2 | |
iter1 - iter2 | 只适用于vector和deque |
>, >=, <, <= | 比较迭代器的位置关系;只适用于vector和deque |
back() | 返回容器的最后一个元素的引用。如果容器为空,则该操作未定义 |
front() | 返回容器的第一个元素的引用。如果容器为空,则该操作未定义 |
c[n] | 返回下标为n的元素的引用;如果n<0 or n>=size(),则该操作未定义 |
at[n] | 返回下标为n的元素的引用;如果下标无效,则抛出异常out_of_range异常 (注:只适用于vector和deque容器) |
erase(p) | 删除迭代器p所指向的元素。返回一个迭代器,它指向被删除的元素后面的元素。如果p指向容器内最后一个元素,则返回的迭代器指向容器的超出末端的下一个位置;如果p本身就是指向超出末端的下一个位置的迭代器,则该函数未定义 |
erase(b, e) | 删除[b, e)内的所有元素。返回一个迭代器,它指向被删除元素段后面的元素。如果e本身就是指向超出末端的下一个位置的迭代器,则返回的迭代器也指向超出末端的下一个位置。 |
clear() | 删除容器内的所有元素,返回void |
pop_back() | 删除容器内的最后一个元素,返回void。如果容器为空,则该操作未定义。 |
pop_front() | 删除容器内的第一个元素,返回void。如果c为空容器,则该操作未定义 (注:只适用于list和deque容器) |
c1 = c2 | 删除容器c1的所有元素,然后将c2的元素复制给c1。c1和c2的类型必须相同。 |
c1.swap(c2) | 交换内容:调用该函数后,c1中存放的是c2原来的元素,c2中存放的是c1原来的元素。c1和c2的类型必须相同。该函数的执行速度通常要比将c2的元素复制到c1的操作快。 |
c.assign(b, e) | 重新设置c的元素:将迭代器b和e标记的范围内所有的元素复制到c中。b和e必须不是指向c中元素的迭代器。 |
c.assign(n, t) | 将容器c重新设置为存储n个值为t的元素。 |
vector (连续的空间存储,可以使用[]操作符)快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间岁间的插入,删除元素要慢,而且如果一开始分配的空间不够的话,有一个重新分配更大空间,然后拷贝的性能开销。
deque (小片的连续,小片间用链表相连,实际上内部有一个map的指针,因为知道类型,所以还是可以使用[],只是速度没有vector快)快速的访问随机的元素,快速的在开始和末尾插入元素,随机的插入,删除元素要慢,空间的重新分配要比vector快,重新分配空间后,原有的元素不需要拷贝。对deque的排序操作,可将deque先复制到vector,排序后在复制回deque。
list (每个元素间用链表相连)访问随机元素不如vector快,随机的插入元素比vector快,对每个元素分配空间,所以不存在空间不够,重新分配的情况。
set:内部元素唯一,用一棵平衡树结构来存储,因此遍历的时候就排序了,查找也比较快的哦。
map :一对一的映射的结合,key不能重复。
stack :适配器,必须结合其他的容器使用,stl中默认的内部容器是deque。先进后出,只有一个出口,不允许遍历。
queue: 是受限制的deque,内部容器一般使用list较简单。先进先出,不允许遍历。
vector<bool> 与bitset<> ,前面的可以动态改变长度。
priority_queue: 插入的元素就有优先级顺序,top出来的就是优先级最高的了
valarray 专门进行数值计算的,增加特殊的数学函数。
s.empty() | 如果栈为这人,则true;否则返回false |
s.size() | 返回栈中元素的个数 |
s.pop() | 删除栈顶元素,但不返回其值 |
s.top() | 返回栈顶元素的值,但不删除该元素 |
s.push(item) | 在栈项压入新元素 |
q.empty() | 如果队列为空,则返回true;否则返回false |
q.size() | 返回队列中元素的个数 |
q.pop() | 删除队首元素,但不返回其值 |
q.front() | 返回队首元素的值,但不删除该元素 (注:该操作只适用于队列) |
q.back() | 返回队尾元素的值,但不删除该元素 (注:该操作只适用于队列) |
q.top() | 返回具有最高优先级的元素值,但不删除该元素 |
q.push(item) | 对于queue,在队尾压入一个新元素; 对于priority_queue,在基于优先级的适当位置插入新元素 |