C++ STL容器总结
1. STL 容器

1. 按种类划分
- 顺序容器( sequence containers):是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。顺序容器包括:vector(向量)、list(双向列表)forward_list(单向链表)、deque(队列)。
- 关联容器(associative containers):关联式容器是非线性的树结构,更准确的说是红黑树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。但是关联式容器提供了另一种根据元素特点排序的功能,这样迭代器就能根据元素的特点“顺序地”获取元素。元素是有序的集合,默认在插入的时候按升序排列。关联容器包括:map(集合)、set(映射)、multimap(多重集合)、multiset(多重映射)。
- 无序容器(unordered containers):unordered_set、unodered_multiset、unordered_map、unodered_multimap都是无序容器,都是以哈希表实现的 ,
2. 各容器的特点对比
|
PK |
vector |
deque |
list |
set |
multiset |
map |
multimap |
|
名称 |
向量容器 |
双向队列容器 |
列表容器 |
集合 |
多重集合 |
映射 |
多重映射 |
|
内部数 据结构 |
连续存储的数组形式(一端开口的组) |
连续或分段连续存储数组(两端开口的数组) |
双向环状链表 |
红黑树(平衡检索二叉树) |
红黑树 |
红黑树 |
红黑树 |
|
头文件 |
#include <vector> |
#include <deque> |
#include <list> |
#include <set> |
#include <set> |
#include <map> |
#include <map> |
|
定义容器 |
vector<string> book(50); |
deque<string> book(50); |
list<string> book; |
set<string> book; |
multiset<string> book; |
map<int,string> book; |
multimap<int,string> book; |
|
操作元素的方式 |
下标运算符:[0](可以用迭代器,但插入删除操作时会失效) |
下标运算符或迭代器 |
只能用迭代器(不断用变量值来递推新值,相当于指针),不支持使用下标运算符 |
迭代器 |
迭代器 |
迭代器 |
迭代器 |
|
插入删除操作迭代器是否失效 |
插入和删除元素都会使迭代器失效 |
插入任何元素都会使迭代器失效。删除头和尾元素,指向被删除节点迭代器失效,而删除中间元素会使所有迭代器失效 |
插入,迭代器不会失效。删除,指向被删除节点迭代器失效 |
插入,迭代器不会失效。删除,指向被删除节点迭代器失效 |
插入,迭代器不会失效。删除,指向被删除节点迭代器失效 |
插入,迭代器不会失效。删除,指向被删除节点迭代器失效 |
插入,迭代器不会失效。删除,指向被删除节点迭代器失效 |
|
特点 |
增加和获取元素效率很高,插入和删除的效率很低 |
增加和获取元素效率 较高,插入和删除的 效率较高 |
增加和获取元素效率 很低,插入和删除的 效率很高 |
1.键(关键字)和值(数据)相等(就是模版只有一个参数,键和值合起来) 2.键唯一 3.元素默认按升序排列 |
1.键和值相等 2.键可以不唯一 3.元素默认按升序排列 |
1.键和值分开(模版有两个参数,前面是键后面是值) 2.键唯一 3.元素默认按键的升序排列 |
1.键和值分开 2.键可以不唯一 3.元素默认按键的升序排列 |
3. 迭代器删除元素的会发生什么?
答:分情况:关联容器和顺序容器两种:
a. 对于序列式容器(如vector,deque,list等),删除当前的iterator会使后面所有元素的iterator都失效。这是因为vector,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。不过erase方法可以返回下一个有效的iterator。
b. 对于关联容器(如map,set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前的iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入,删除一个结点不会对其他结点造成影响。
C++ STL容器总结的更多相关文章
- STL容器
啦啦啦,今天听啦高年级学长讲的STL容器啦,发现有好多东西还是有必要记载的,毕竟学长是身经百战的,他在参加各种比赛的时候积累的经验可不是一天两天就能学来的,那个可是炒鸡有价值的啊,啊啊啊啊啊 #inc ...
- c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...
- STL容器删除元素的陷阱
今天看Scott Meyers大师的stl的用法,看到了我前段时间犯的一个错误,发现我写的代码和他提到错误代码几乎一模一样,有关stl容器删除元素的问题,错误的代码如下:std::vector< ...
- 【转】c++中Vector等STL容器的自定义排序
如果要自己定义STL容器的元素类最好满足STL容器对元素的要求 必须要求: 1.Copy构造函数 2.赋值=操作符 3.能够销毁对象的析构函数 另外: 1. ...
- GDB打印STL容器内容
GDB调试不能打印stl容器内容,下载此文件,将之保存为~/.gdbinit就可以使用打印命令了. 打印list用plist命令,打印vector用pvector,依此类推. (gdb) pvecto ...
- STL容器迭代器失效分析
连续内存序列容器(vector, string, deque) 对于连续内存序列STL容器,例如vector,string,deque,删除当前iterator会使得后面所有的iterator都失效, ...
- STL容器的适用情况
转自http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ ly; mso-default-props:yes; m ...
- STL容器的遍历删除
STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的 ...
- STL容器与配接器
STL容器包括顺序容器.关联容器.无序关联容器 STL配接器包括容器配接器.函数配接器 顺序容器: vector 行为类似于数组,但可以根据要求 ...
- STL容器的本质
http://blog.sina.com.cn/s/blog_4d3a41f40100eof0.html 最近在学习unordered_map里面的散列函数和相等函数怎么写.学习过程中看到了一个好帖子 ...
随机推荐
- BZOJ2655calc
题目描述 一个序列a1,...,an是合法的,当且仅当:长度为给定的n.a1,...,an都是[1,A]中的整数.a1,...,an互不相等.一个序列的值定义为它里面所有数的乘积,即a1a2...an ...
- GraphQL
GraphQL 官方描述: GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时. GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地 ...
- django 3.post接口开发
如果有了一个项目,还想创建一个项目,那么就是进入项目的路径下,运行命令,比如: cd /Users/newcomer/PycharmProjects/djangoProject python3 man ...
- Synchronized与ReentrantLock区别总结(简单粗暴,一目了然)
这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍. 相似点:这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的 ...
- slickedit编译调试linux应用程序
目录 slickedit编译调试linux应用程序 工程建立 编译 智能报错跳转 配置编译环境 调试 title: slickedit编译调试linux应用程序 date: 2019/3/19 17: ...
- Rancher2.1安装部署
基础环境配置 1.操作系统选择 Ubuntu 16.04(64位 Server版) Centos/RedHat Linux 7.5+(64位) 2.Docker版本选择 1.12.6 1.13.1 1 ...
- go语言基础知识笔记(二)之数组和切片
数组和切片知识用的也是比较多,的给我们工作带来很大的便利 (一) 数组 定义:在golang中数组的长度是不可变,数组存放要求是同一种数据类型 //golang中数组定义的四种方法1.先声明,后赋值 ...
- Writage让你的Word支持Markdown
Writage 简单的执行后,word就可以在保存或打开的时候支持Markdown了!
- Now you can provide attr "wx:key" for a "wx:for" to improve performance. 微信小程序警告
Now you can provide attr "wx:key" for a "wx:for" to improve performance为警告,不处理不影 ...
- jmeter创建时间函数
固定格式的年月日 ${__time(yyyyMMdd,)} 20151214 //返回年月日 ${__time(HHmmss,)} 092816 //返回时分秒 ${__time(yyyyMMdd-H ...