常见的STL有:vector、list、stack、queue、deque、map、set
接下来我将依此介绍这些STL以及其常见的用法。
序列式容器:
vector是一个动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。
vector所采用的数据结构非常简单:线性连续空间。它以两个迭代器start和finish分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间的尾端。一旦容量等于大小,便是满载,下次再有新增元素,vector的整个数组就得另觅他处。
动态扩容:当插入新元素发现当前容量不够时,扩容机制又是如何的?接下来我们通过代码来分析一下。
#include"Test.h" #include<vector> #include<list> #include<array> #include<algorithm>//为了使用find、sort等方法 void main() { setlocale(LC_ALL, "chs");//识别中文 //vector举例 vector<int> v1(3, 8); cout << "当前数组大小:" << v1.size() << endl; cout << "当前数组容量:" << v1.capacity() << endl; v1.push_back(1); cout << "当前数组大小:" << v1.size() << endl; cout << "当前数组容量:" << v1.capacity() << endl; v1.push_back(2); cout << "当前数组大小:" << v1.size() << endl; cout << "当前数组容量:" << v1.capacity() << endl; v1.push_back(3); cout << "当前数组大小:" << v1.size() << endl; cout << "当前数组容量:" << v1.capacity() << endl; v1.push_back(4); cout << "当前数组大小:" << v1.size() << endl; cout << "当前数组容量:" << v1.capacity() << endl; v1.push_back(5); cout << "当前数组大小:" << v1.size() << endl; cout << "当前数组容量:" << v1.capacity() << endl; for (vector<int>::iterator v2 = v1.begin(); v2 != v1.end(); v2++) { cout << *v2 << endl; } v1.pop_back(); v1.pop_back(); v1.pop_back(); v1.pop_back(); v1.pop_back(); cout << "当前数组大小:" << v1.size() << endl; cout << "当前数组容量:" << v1.capacity() << endl; v1.clear(); cout << "当前数组大小:" << v1.size() << endl; cout << "当前数组容量:" << v1.capacity() << endl; //用list实现增改删除 }
我从书本中看来的是动态扩容机制是以原本的2倍容量扩容,并且是另外开辟一块内存空间实现内存数据的拷贝,但是我在自己手写测试代码的扩容的过程中,感觉并不是以2倍的大小扩容,更像是以1.5倍的大小进行扩容,并且感觉v1的地址也没有进行改变。。。。后三张和前面几张图片的v1地址不同是因为,我截后几张图的时候,是重新调试了。
但是经过实验可以验证,当我们的最大容量和数组大小一样的时候,再进行插入,会进行扩容,并且通过pop_back或者clear方法,只会清除里面的数据,不会改变vector的容量大小,即它会动态扩容,但不会自动缩小。
erase使用注意,避免迭代器失效:
for (vector<int>::iterator v2 = v1.begin(); v2 != v1.end();) { if (*v2 == 1) { v2 = v1.erase(v2, v2 + 3); } else { v2++; } }
“No amount of money ever bought a second of time.”
参考资料:
《STL源码剖析》






