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,所以手动加上一句,并不会有什么坏事。
- vector容器基础学习感悟
- C++基础-vector容器
- Vector容器学习
- 容器 vector 学习
- vector容器学习
- vector 向量容器基础应用
- C++vector基础容器2.0
- java基础学习感悟
- C++学习笔记--vector容器
- STL学习之vector容器
- STL容器\vector学习随笔
- STL学习(二)--vector容器
- C++学习之容器<vector>
- c++ vector 基础学习
- STL学习(三)vector容器学习
- java基础学习感悟【转】
- STL学习:顺序容器-vector
- 初学者学习C++STL之vector容器
- Android 属性动画(Property Animation) 完全解析 (下)
- 产妇诞下12.6斤重巨婴
- java 静态代码块详解
- 智力题:1-28题
- Mac 常用软件下载
- vector容器基础学习感悟
- js 字符串操作函数
- Java中普通代码块,构造代码块,静态代码块区别及代码示例
- 【CF 459D】 Pashmak and Parmida's problem
- Xcode 7.0 beta 5 相对于 beta 4改变
- 台风“苏迪罗”夜间登陆福建最大风力15级
- 转:“智齿”到底该不该拔?
- 关于synchronized具备原子性的问题
- Leetcode48 Rotate Image