STL之vector
来源:互联网 发布:mysql root 修改密码 编辑:程序博客网 时间:2024/05/09 11:22
现在正在系统的学习C++的STL编程,首先要学习的就是vector了:
vector容器呢,是一种支持随机访问,我们就可以认为vector就是一种泛化的数组。
可以进行向后插入的动态数组,在尾端插入和删除元素的时间复杂度都是常数,其他元素的插入删除是o(n)线性的,根据元素插入删除可动态调整内存空间
应该对该容器需要知道的就是增删查找了,不说别的只上代码吧,
#include<vector>#include<iostream>#include<algorithm>using namespace std;bool mySort(const int& a,const int& b){ if(a>b) return true; return false;}int main(){ vector<int> a; cout<<"the default size of vector is "<<a.capacity()<<endl; a.push_back(3) ; a.push_back(12); a.push_back(534); a.push_back(32); a.push_back(6534); a.push_back(4); a.push_back(1); //we begin to Traversal the vector for(int i=0;i<a.size();i++) { cout<<a[i]<<endl; } //we need to find the given value in the vector int value=4; cout<<"this is after delete some element\n"; vector<int>::iterator itr; for(itr=a.begin();itr!=a.end();itr++) { if(value==*itr) a.erase(itr); } for(itr=a.begin();itr!=a.end();itr++) { cout<<*itr<<endl; } cout<<"after the sort output\n"; sort(a.begin(),a.end(),mySort); for(itr=a.begin();itr!=a.end();itr++) { cout<<*itr<<endl; } return 0;}
这里面需要注意的呢,就是如果要使用vector则要加入头文件<vector>如果要使用sort函数则需要加入头文件<algorithm>头文件,这样就好,需要注意的就是mysort函数了,返回值是布尔类型的,大于是真则是降序排列,反之则是升序排列了
vector的内存管理:
vector的内存管理,他只会动态增长,不会减小,也就是说,如果你没有指定,vector的元素个数的话,如果当前为其分配的内存不够使用的话,就只能再次重新分配(一般不会push_back或者insert一次就malloc一次),realloc分配的大小一般是当前内存大小的两倍,而在realloc之前可使用的数量大小是capacity属性。所以呢,vector是支持随机访问的。但是在内存方面的不足之处在于,vector只能增大不能减少,也就是说没有reserve的操作,性能就会大大降低,如果你有1000个元素的vector,但是erase了后面的999个,这1000个元素的空间仍然不会释放,只有整个vector释放时,他才会被释放。如果想要动态内存释放的话,可以使用deque或者list
除此之外,我们还需要注意的就是vector动态数组元素的插入也是无限制的,事先没有任何的比较过程,也就是说,无论重复与否,都可以进行插入操作
在vector向量初始化时,会传入一个内存分配器,其内存分配器也即封装了malloc和free函数,进行内存的分配和回收,该内存分配器也是一个类,但是我们使用的该类的几个成员函数都是静态函数
现在看看vector的三个重点变量 M_Start M_Finish 和 M_end_of_Storage,分别表示向量的起始地址、向量有效数据的终止地址、向量内存结束地址
1、如果是vector的插入操作,
1.1、首先看看当前vector可使用内存是否已经满了,如果没有,则检测插入位置是否是末尾,如果是的话,则只需将在M_Finish位置上添加数据,而后进行M_Finish++操作,如果添加位置不在末尾位置上,则将最后一个位置上的数据复制到最后一个位置的后一个,然后呢将指定位置之后的数据后移一个单位。接下来就是要将新的数据放在指定的位置上!!
1.2、如果当前位置已经满了则放大当前两倍的空间,然后进行上述的插入操作
2、如果是删除操作,则主要操作就是对M_Finish的移动,如果是最后一个元素的删除操作,则进行最后一个元素的西构函数M_Finish--,如果不是最后一个元素的话,则将要删除的元素其后的全部元素前移一个单位
小结:
由此可见,vector向量由始至终都没有内存的释放的操作。所以vector就是一个内存不断增加过程
- 【STL】STL容器之vector
- STL之vector模板
- STL之vector
- STL之vector
- stl之vector使用
- STL之vector详解
- STL之vector
- STL之vector使用
- STL之vector
- STL容器之vector
- STL容器之 vector
- STL之vector容器
- STL容器之vector
- STL之向量(vector)
- STL之Vector
- C++ STL之vector
- STL之Vector用法
- stl库之vector
- iOS 向服务器POST参数
- Android相对布局+圆角按钮+Shape样式
- 装修施工隐蔽工程问题多 不得不注意
- Redis cluster 规范
- 招募爱心家庭为藏区孤儿圆梦
- STL之vector
- 通过网页打开应用程序
- 打开svn更新“死结”
- 5. 面对对象(基础) Part 2 --- 学习笔记
- LoadRunner动态获取参数
- android 资源种类及用法
- JavaScript探秘:强大的原型和原型链
- php 数组命名上传图片后台获取格式
- java字符串长度不够前面补0。(自定义流水号)