分享

vector以及使用举例--C++基础

 KookNut39 2021-12-15

常见的STL有:vector、list、stack、queue、deque、map、set
接下来我将依此介绍这些STL以及其常见的用法。
序列式容器:
vector是一个动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。
vector所采用的数据结构非常简单:线性连续空间。它以两个迭代器startfinish分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器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源码剖析》

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多