常用的数据结构:array\list\tree\stack\queue\hash table\set\map…
1 vector
1.1 vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率。因为“配置新空间/数据移动/释放旧空间”是一个大工程。
1.2 vector的迭代器提供的是Random Access Iterators。
`typedef value_type* iterator; //vector的迭代器是普通的指针`
1.3 vector所采用的数据结构:线性连续空间。它以两个迭代器start和finish分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端。
注意①:增加新元素(s)时,如果超过当时的容量,则容量会扩充至两倍。如果两倍容量仍不足,就扩充至足够大的容量。
②:容量的扩张必须经历“重新配置、元素移动、释放原空间”等过程。
2 list
2.1 list的节点(node)
//是个双向链表
template <class T>
struct __list_node {
typedef void* void_pointer;
void_pointer prev; //型别为void*,其实可以设为__list_node<T>*
void_pointer next;
T data;
}
2.2 list的迭代器是Bidirectional iterator。由于STL list是一个双向链表,还是一个环状双向链表,迭代器必须具备前移、后移的能力,并有能力进行正确的递增、递减、取值、成员存取等操作。
list的一个重要性质:插入操作和接合操作都不会造成原有的list迭代器失效,甚至list的元素删除操作,只有“指向被删除元素”的那个迭代器失效,其他的迭代器不受影响。
2.3 list内部提供一个所谓的迁移操作(transfer):将某连续范围内的元素迁移到某个特定位置之前。
//将[first,last)内的所有元素移动到position之前
void transfer(iterator __position, iterator __first, iterator __last) {
if (__position != __last) {
// Remove [first, last) from its old position.
__last._M_node->_M_prev->_M_next = __position._M_node;
__first._M_node->_M_prev->_M_next = __last._M_node;
__position._M_node->_M_prev->_M_next = __first._M_node;
// Splice [first, last) into its new position.
_List_node_base* __tmp = __position._M_node->_M_prev;
__position._M_node->_M_prev = __last._M_node->_M_