vector容器基础学习感悟

来源:互联网 发布:电脑打电话软件下载 编辑:程序博客网 时间:2024/05/05 16:39

自从学习了vector这个容器类,就深深的感觉到了它的实用性。
以下是个人的一些实用经验,如果有错的话,还望指正。

template<typename T>    explicit vector();                                 // 默认构造函数,vector对象为空    explicit vector(size_type n, const T& v = T());    // 创建有n个元素的vector对象    vector(const vector& x);    vector(const_iterator first, const_iterator last);

我常用到的有前面两种结构,第一种结构,适合于不知道所要序列长度的情况,初始时会默认申请一片大小的空间SIZE,当在容器中不停的加入数据之后,如果超过了最大空间的话,程序就会重新申请一片空间,并且在里面加入数据。
在这里谈一下个人对于VECTOR与链表的对比:
在不停的往数据组内加数据的时候,链表每加一个数据就需申请一次,而VECTOR只需要在超过最大上限的时候申请一次(当然拷数据消耗的时间基本可以不计,用过MEMCOPY的人可能都知道,拷数据的过程是极其快的)。在加数据的时候,显然VECTOR比较优秀,不过当你的程序用到内存比较紧张时,有可能不容易一下子申请一片空间出来,这个时候就只能退而求其次来使用链表来申请空间了。
在读取数据时,对于VECTOR,要访问第I个元素所需的时间为TCAL + TREAD即可,即只要先计算出数据所在的地址,然后访问即可。而对于链表来说,消耗时是为TREAD*I,显然链表的速度是很慢的,特别是在这个元素在较后面时。
在插入和删除方面,对于第I个元素来说,链表只需要做的就是一次申请空间,然后改变指针的指即可,而VECTOR类则需要将I后面的所有元素都进行移动,显然链表的耗时远远小于VECTOR所需要的耗时。
在清空方面,VECTOR类所需要的只是一次的释放空间即可,而链表则需要从开始一个一个的释放。
总结一下:大部分时候建议还是使用VECTOR,但是如果你的数据需要大量的插入和删除的话,或者你的电脑吃紧的话,还是改用链表的方法。当然STL也有LIST这个类可以使用。

说往链表就不得不提一下数组,VECTOR的第二种形式就是有点类似于动态数组的结构。如果你的数据已经确定好了大小的话,那么我还是建议使用动态数组,因为这样子便于内存上的管理和利用。但是如果你的数据只是知道一个大概的范围的话,那么就使用VECTOR方法,因为便于控制插入,并且长度也可以通过VECTORSIZE来确定。另外对于动态数组,在DEBUG模式下,也许你申请了SIZE的长度,但是可能后面系统会预留一部分的空间,所以即使你越界了,也不会崩溃,但是在RELEASE版本下的空间是严格控制的,所以如果你是一个可能不是很认真的人,也最好使用VECTOR来储存数据,因为可以使用迭代器来保证稳定性。

另外如果你的程序如下:

vector<vector<int>> vectorTest1;int a = 0;vectorTest1[0].push_back(a);vector<vector<int>> vectorTest2;int b = 0;vectorTest2[1].push_back(b);

对于上面一种我没测试过,所以不知道会不会崩,但是如果你写的方式是下面一种的法,那么肯定是不稳定的。因为上面是在VECTOR这个类的首地址开始加元素,也许不会崩,但是下面一种的话,由于vctorTes不知道第二维的深度,所以也就没有办法计算出第一维的地址,就会导致崩溃。所以建议改成以下的方式:

vector<vector<int>> vectorTest1(length,vector<int>(0));int a = 0;vectorTest1[1].push_back(a);

上面是在已知第一维的长度的情况下,你也可以使用以下的方式

vector<vector<int>> vectorTest1;vector<int> vectorTmp;int a = 0;vectorTmp.push_back(a);vectorTest1.push_back(vectorTmp);

最后说一下VECTOR类型的释放,虽然对于这些封装好的程序,在不用时会自动释放,但是也很有可能导致一些问题,比如说

for (int i = 0; i < size; i++){    vector<int> vectorTest;    vectorTest.push_back(i);}

我就曾经在使用上面代码的时候导致了崩溃,虽然按理解中,每循环一次,就会重置vectorTest,但是结果却是容量不停的加。至于原因我还没有找到。vector的释放语句如下:

vectorTest.clear();vector<vector<int>>(vectorTest).swap(vectorTest);

第一句是将数据清空,但是此时还在占用着空间,所以需要将空间也给释放出来。也许你没有释放的习惯,但是我还是建议你加上释放的过程,毕竟这个步骤早晚都是要做的,只不过是由库或者你自己来做,将程序控制在可控范围内还是很重要的。任何的程序都会有BUG,所以手动加上一句,并不会有什么坏事。

0 0
原创粉丝点击