STL之vector

现在正在系统的学习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就是一个内存不断增加过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值