1 vector
vector与array的区别在于,空间运用的灵活性不同。array是静态空间,大小不能动态改变。vectro则不同,vector随着元素的增加,空间也会不断增加,用户不需要空间怎么增加。
vector的关键在于:对大小的控制以及重新配置内存时,数据移动的效率问题。
vector迭代器用的是Random Access Iterators。vector的迭代器就是普通指针。
vector的数据结构
start 表示目前使用空间的头;finish表示目前使用空间的尾后。end_of_storage表示目前可用空间的尾后。
vector内存管理:
在插入元素前要判断可用空间是否够用。如果不够用,则需要分配新空间。新空间的大小是旧空间的两倍。然后旧空间数据移动/在新空间插入新数据/析构并释放旧空间。这种内存管理机制,使得当重新分配新空间后,之前的迭代器全部失效。
vector插入操作:
假设备用空间足够容纳待插入的数据:
情况1:插入位置到finish的距离>插入元素的个数
情况2:插入位置到finish的距离<=插入元素的个数
如果备用空间不足以容纳新增数据:
2 list
list 结构是一个双向链表,而且是个环状的双向链表。只用一个指针便能表示整个环状双向链表。
list有一个空白结点,链表的指针成员node指向它,当链表为空时,node->pre 与node->next 都指向node自身。
因为list是双向链表,所以list的迭代器是Bidirectional Iterators。list与vector对比,一个重要的性质是,结点插入操作不会引起旧迭代器的失效。因为list是链式存储,没有vector的空间不足,重新分配的问题。
list中值得注意的地方:
1 成员函数unique()实现,只有“连续相同的元素”才会被除剩一个。
2 STL算法sort()只接受RandomAccessIterator,而list的迭代器类型为BiDirectional Iterators。