当前位置 博文首页 > KOOKNUT的博客:vector以及使用举例--C++基础

    KOOKNUT的博客:vector以及使用举例--C++基础

    作者:[db:作者] 时间:2021-07-02 21:31

    常见的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源码剖析》

    cs
    下一篇:没有了