迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可以称之为广义指针,通过sizeof(vector::iterator)来查看,所占内存并不是4个字节。
对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效。vector元素在内存中是顺序存储,向当前容器中添加元素时,可能导致后面邻接的内存没有一个空闲空间,而vector的元素必须顺序存储一边索引访问,于是vector必须重新分配存储空间,用来存放原来的元素以及新添加的元素:存放在旧存储空间的元素被复制到新的存储空间里,接着插入新的元素,最后撤销旧的存储空间。这种情况发生,一定会导致vector容器的所有迭代器都失效。
为了使vector容器实现快速的内存分配,实际分配的容器会比当前所需的空间多一些,vector容器预留了这些额外的存储区,用来存放新添加的元素,而不需要每次都重新分配新的存储空间。
总结:
要把迭代器、指针和引用的失效次数减到最少,应该使用基于节点的容器(链表),因为在这些容器上进行插入和删除不会使迭代器、指针和引用失效(除非它们指向你删除的元素)。一般来说,在连续内存容器上插入和删除会使所有指向容器的迭代器、指针和引用失效。