C++ STL中vector的使用方法

使用vector需要包含头文件

#include <vector>

   

一、定义和初始化

    vector<char> v0;

    vector<char> v1(5);//初始化大小至少为5,实际capacity可能会稍大一点

    vector<char> v1a(6,'x');//初始化大小为6,各元素初始值为'x'

    vector<char> v2(v1a);//构造一个vector,其capacity==vla.size(),元素和v1a完全一样

    char hello[]="Hello";

    vector<char> v3(hello, hello+5);//hello+5指向需要拷贝的最后一个元素的下一个位置

    vector<IP> v4(2);//会调用类IP的无参数构造函数来构造IP类型的对象 new IP()

 

   二、遍历vector

    接上面的定义。

for(vector<char>::iterator itr = v1.begin();itr!=v1.end(); itr++){

        cout<< *itr;//输出是5个空格字符

    }

 

    for(int i = 0; i <v1.size(); i++){//循环0次,因为size为0

        cout<< v1[i];

    }

 

    for(int i = 0; i <v2.size(); i++){

        cout<< v2[i];//输出xxxxxx

    }

   

    for(int i = 0; i <v3.size(); i++){

        cout<< v3[i];//输出Hello

    }  

 

    cout <<v4[0].d1<<"."<<v4[0].d2<<"."<<v4[0].d3<<"."<<v4[0].d4;

//输出255.255.255.255,IP()中会赋值d1=d2=d3=d4=255

 

   三、增加、赋/取值

    vector<char> v0;

    v0.push_back(‘a’);//增加元素到尾部,可能引起vector容量的增加

    v0.push_back('b');

    v0.push_back('c');

    v0[2] = 'x';//若下标越界,则为抛出异常

    cout <<v0[1] << v0.at(2);//若下标越界,则为抛出异常

 

    char str[] = "1234";

    v0.insert(v0.begin()+ 2, str, str + 4);//在v0[2]之前插入1234; v0 = ab1234x

    v0.insert(v0.begin(),2, '1');//在v0[0]之前插入11;v0=11ab1234x

    v0.insert(v0.begin(),'0'); //在v0[0]之之前插入0;v0=011ab1234x

   

   四、删除

    vector<char> v0;

    v0.push_back('a');

    v0.push_back('b');

    v0.push_back('c');

    v0.push_back('d');

    v0.push_back('e');//v0=abcde

 

    v0.pop_back();//删除最后一个元素,该函数没有返回值;v0=abcd

    vector<char>::iterator itr0 = v0.begin() +1;

    itr0 =v0.erase(itr0);//删除itr0指向元素,之后返回指向被删除元素下一位置,itr0变为无效迭代器,再使用则报vector iterators incompatible异常;v0 = acd

    itr0 =v0.erase(itr0, v0.end()); //删除[itr0, end)之间的元素,之后返回指向被删除最后的元素下一位置,这里是end

    v0.clear(); //清空所有元素

 

   五、获取状态

    vector<char> v0;

    v0.push_back('a');

    v0.push_back('b');

    v0.push_back('c');

    boolflag = v0.empty();//判断是否为空

   int num = v0.size();//元素个数

    intcapa = v0.capacity();//总容量大小,即可以放多少个元素

    v0.resize(100);//改变size大小。若新容量值N<size(),原尾部size()-N个元素会被删除;否则,在尾部插入N-size()个用用无参构造函数构造的对象。

    v0.reserve(100);//确保以后调用capacity时,返回值>=100

 

   六、内存分配问题

    1)保留内存

假定你想建立一个容纳1-1000值的vector<int>:

vector<int> v;
for (int i = 1; i <= 1000; ++i)

 v.push_back(i);

在大多数STL实现中,这段代码在循环过程中将会导致2到10次重新分配。因为vector在重新分配发生时一般把容量翻倍。所以,这种做法的开销很大。

    当可预先估计所需容量时,可以为vector保留足够大小的容量,以免重新分配带来的开销。可以这样做:

    vector<int>v(1000);

    for(int i = 1; i <= 1000; ++i) v.push_back(i);
   

    或者

    vector<int>v;

    v.reserve(1000);//保留1000个元素的存储空间

    for(int i = 1; i <= 1000; ++i) v.push_back(i);

    第一种方法直接在构造时就保留了至少1000个存储单元,第二种方法会引起1次内存重新分配,因为建议用第一种方法。

 

    2)收缩内存

如果需要收缩vector v的内存到恰好足够实际元素存放的大小,可调用

    vector<int>(v).swap(v);

    该语句首先构造一个临时的vector对象,该对象的capacity大小,只够存放v的所有元素,并且元素与v相同。然后,将临时对象和v的存储进行交换。之时,v就没有多余的存储空间了。语句执行完后,临时对象被释放。该语句的执行需要一定的时间开销。

   

    3)完全释放内存

    vector<int>v;

    …

    v.clear();//capacity不变,size变成0

    vector<int>().swap(v);//capacity变成0

 

   七、地址失效问题

    v.insert(itr,‘2’);

    v.erase(itr);

    insert和erase发生位置之后的迭代器均会失效,在上面的例子中,原来指向itr之后元素的迭代器均会失效。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值