Chapter 9 Sequence Container

2020-03-17  本文已影响0人  再凌
容器 内容 说明
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实现

适配器不可以使用底层实现容器的操作, 只能使用自己的操作

上一篇下一篇

猜你喜欢

热点阅读