1、vector
空间运用的灵活性。
实现技术——关键是对大小的控制以及重新配置时的数据移动效率。
配置新空间、数据移动、释还旧空间
erase(int position)先移动覆盖元素之后删除最后一个
vector维护的是一个连续线性空间提供的是Random Access Iterators
find(begin,end,k)如果找到k则iter指向k,如果没找打iter指向end。当在此插入元素的时候,如果插入成功返回*iter的时候的时候程序出错(内存的原因,可能是经过插入步骤之后iter指针失效,但从新遍历整个vector时是正确的,刚插入的元素也在里边)。--------不清楚为什么不失效???
所谓的动态增加大小,并不是在原空间之后连续新空间(因为无法保证空间之后尚有可供配置的空间),对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。
insert(position,n,x),插入点之后现有元素>=n,先把position+n----finish复制到finish之后,在吧position-----position+n复制到finish之前,之后在插入元素。插入点之后现有元素<=n,先插入n-(finish-position)个x,之后把position----finish(旧的那个,不是现在更行的finish)复制到x之后的内存,之后在开始插入其余的x。
erase(first,last)先移动覆盖,即从last----finish到first开始往后,以后再释放内存。(局部区间的清楚操作)
2、list
list不再能够像vector一样以普通指针作为迭代器,节点不保证在存储空间中连续存在。是一个双向链表,迭代器必须具备前移、后移的能力,所以list提供的是Bidirectional Iterators。
插入(insert)和结合(splice)都不会造成原有的list迭代器失效。
在insert的时候不像vector在position出插入,之后不能返回*iter,在这儿能返回*iter,不过是之前的元素,不是新插入的元素。即:插入完成后,新节点将位于哨兵迭代器所指节点的前方。
transfer(position,first,last)--迁移操作。splice操作和reverse操作都是经过迁移操作完成的。
3、deque
deque没有容量的概念(capacity)。因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并连接起来。因此deque没必要提供所谓的空间保留(reserve)功能。
提供Random Access Iterator,但他的迭代器并不是普通的指针。
deque是由一段段的定量连续空间构成。最大的任务,就是在这些分段的定量的连续空间上,维护其整体连续的假象,并提供随机存取的接口。避开了重新配置、复制、释放的轮回,待嫁则是复杂的迭代器架构。
分段的线性空间,就必须有重要控制器,而为了维持整体连续的假象,数据结构的设计及迭代器前进后退等操作都颇为繁琐,deque的实现代码分量远比vector或list都多得多。
deque采用一块所谓的map做为主控。map是一小块儿连续空间,其每个元素都指向缓冲区,可以说这个元素是指向指针的指针。
deque具备的结构::必须能够指出分段连续空间(缓冲区)在哪里,其次必须能够判断自己是否已经处于其所在缓冲区的边缘,如果是,一旦前进或后退时就必须跳跃至下一个或上一个缓冲区。为了能够正确的跳跃,deque必须随时掌握管控中心(map)。
deque除了维护一个先前说过的指向map的指针外,也维护start,finish两个迭代器,分别指向第一缓冲区的第一个元素和最后一个元素(的下一位置)。此外,它当然也必须记住目前的map大小。因为一旦map所提供的节点不足,就必须重新配置更大的一块儿map。
deque的最初状态(无任何元素时)保有一个缓冲区,因此,clear()完成之后恢复初始状态,也一样要保留一个缓冲区。