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就是一个内存不断增加过程

0 0