容器 | 内容 | 说明 |
---|---|---|
vector / string | 除了在尾部, 其他的增删都很慢, 可随机访问 | 增减元素可能会导致元素位置发生移动 |
deque | 除了在两头, 其他增减都很慢 | 在头部插入元素不会影响end迭代器 |
list | 双向链表,只能顺序访问, 但是增删很快 | - |
forward_list | 单向链表 | 不存储size() |
array | 固定大小,不能增减元素 | - |
begin & end 迭代器
两个迭代器都不能比较大小, 只能通过begin != end来判断是否到达末尾
使用array容器代替C语言风格的数组
array<int, 10>
好处: 可以让两个同类型的数组相互赋值
swap(a,b)
作用: 交换两个容器的内容. 不会使指针, 引用失效(除了string和array,对于array, 位置没变, 但是里面的元素值变了)
swap比赋值快的多, 是常数时间.(array除外, 随着size上升线性增长)
assign()方法
重初始化, 和初始化时的传递参数类似, 允许从类型相容的参数来赋值这个容器.
array没有这个方法
容器 - 增加操作
push_back()
push_front()
insert(p, ....) 迭代器/ 集合/ 个数*值/ 值
注意插入在p元素之前, 返回值是新插入的第一个元素位置迭代器
emplace(args)
不创建临时对象, 直接构造, 因此比insert更好
args是这个对象的构造方法, 因此emplace是放入了一个刚构造好的对象
给容器增加元素, 增加的是这个元素的拷贝
使用.at(p)代替[]
如果位置p超出了size范围, 则函数会返回一个out_of_range的error
pop_back()和pop_front() 不负责保存返回值, 调用之前手动存起来
.resize()
增大减少容器大小, 增大时可以指定新初始化
forward_list
单向链表没有指向前一个的指针, 所以插入操作只能放在当前元素的后面, 因此所有的操作都和其他容器不一样.
原来的操作 | forward_list操作 |
---|---|
insert() | insert_after() |
emplace() | emplace_after() |
erase() | erase_after() |
begin() | before_begin()返回首前迭代器 |
string的查找操作
.find()支持很多方式的查找, 如果查找失败, 会返回unsigned类型的-1, 于是显示出来就是UNSIGNED_MAX, 因此这个位置比string里的哪个位置都要大.
适配器
C++提供了三种适配器: stack, queue 和 priority_queue
priority_queue可以为元素设定优先级, 新加入的元素放在所有优先级比他低的元素的前面
创建方法是:
stack<int, deque<int>> xxx
创建一个xxx的空stack, 基于deque实现
类型 | 要求 |
---|---|
stack | 使用除了array和forward_list之外的容器都可以作为底层 |
queue | 要求实现push_back(), back(), push_front(), 因此可以基于list和deque实现 |
priority_queue | 能够随机访问, 实现push_back, pop_back(), front(), 因此可以基于的deque或者vector实现 |
适配器不可以使用底层实现容器的操作, 只能使用自己的操作
网友评论