0%

Sequential container induction

总体来说,顺序容器主要是对元素的操作,获得迭代器等。 #### 1. 分类 顺序容器主要类型:
1. vector:可变大小数组 2. deque:双端队列 3. list:双向链表 4. forward_list:单向链表 5. array:固定大小数组 6. string:字符串

其中仅有array是固定大小的,在功能上和C++自带的数组类似,但是array在标准库中是被精心设计的,更加安全和更加方便使用。

vectorstring的内存空间是连续的,因此可以通过下标来访问,正是因为是连续的,因此可以通过下标来计算元素的地址,从而查找将会非常快速,但是一个巨大缺陷就是,删除增加新的元素将会导致所有其后元素的整体后移,从而非常费时。

listforward_list为链表,链表中元素的地址是不连续的,因此若要查找一个元素,只能进行遍历。正如单向链表的简单定义。

1
2
3
4
struct linknode{
int val; //当前节点的值
linknode *next;//指向下一个节点
};
若要查找值就智能通过指向下一个的指针遍历过去,但是这也导致了如果要插入删除,将会很快。 链表可视化

deque为双向队列,队列的特征决定了在两头添加和删除会很快,随机访问也很快(?为什么)。 #### 2. 迭代器 1. 迭代器操作中forward_list不支持--,这和单向链表这一数据结构符合。 2. 迭代器的范围由一对迭代器表示,
3. 当进行容器之间拷贝时,容器类型和元素类型必须匹配,但是如果通过一个范围来拷贝,元素类型和容器类型都可以不相同(sth.begin(),sth.end()这种)

3. vector

vector<type>,定义为模板类,可采用...<type>=(n,init)初始化
vector的内存空间是需要连续的,每次获取新的空间时候总是会被分配比需求更大的空间来实现稳定的性能。 #### 4. deque deque<type>,定义为模板类,可采用...<type>=(n,init)初始化 #### 5. list list<type>,定义为模板类,可采用...<type>=(n,init)初始化 #### 6. forward_list forward_list<type>,定义为模板类,可采用...<type>=(n,init)初始化 #### 7. array array<type,size>,相比于内置的数组,array支持copy和赋值(不能用花括号包围的值来赋值<-只有你不能),但类型大小要一样。大小是array的一部分。 #### 8. string

9. 一些容易操作

  1. assign array不行

10. 适配器

stackqueue默认是由deque构建,而priority_queue默认是vector,构建适配器的容器必须要具有添加删除元素的能力
适配器只能用自己特殊的操作而不能用底层容器的操作。