码迷,mamicode.com
首页 > 其他好文 > 详细

Vector的相关知识

时间:2015-07-03 18:40:10      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

1.vector是动态空间,支持高效的随机访问和高效向尾部插入新元素的容器。

随着元素的插入,它的内部机制会自行扩充空间以容纳新元素。那么vector会以怎样的方式扩充空间呢?

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec;
    cout<<"Size"<<"\t"<<"sizeof"<<"\t"<<"Capacity"<<endl;
    cout<<vec.size()<<"\t"<<sizeof(vec)<<"\t"<<vec.capacity()<<endl;
    
    for (int i=0;i<20;++i)
    {
        vec.push_back(1);
        cout<<vec.size()<<"\t"<<sizeof(vec)<<"\t"<<vec.capacity()<<endl;
    }

}

程序的运行结果如下:

技术分享

从结果可以看出,当vector的元素个数为0时,分配的内存为0;当插入1个元素后,分配1个单位的空间(此时,分配的内存已被全部占用);再插入一个元素,内存空间翻倍,变为2个单位(此时,分配的内存也被全部占用);再插入元素时,现将内存翻倍,变为4个单位,而实际占用的只有3个.......以此类推,当分配的空间被全部占用时,就再次将内存翻倍。总结,vector的内存是翻倍的方式扩充的

2、vector的数据结构

vector采用的数据结构:线性连续空间,

class vector {

...

protected:

  iterator start;        //表示目前使用空间的头

  iterator finish;        //表示目前使用空间的尾

  iterator end_of_storage;   //表示目前可用空间的尾

...

};

iterator其实就是指针,一个指针占用4个字节,这也就是上面程序的sizeof(vec)结果为12的原因。

 

3、vector的常用操作

(1)begin()    //返回第一个元素的迭代器;

(2)end()      //返回最后一个元素的下一位置的迭代器;

例如,下面是只有2个元素的vector的结果:

技术分享

(3)capacity()  //返回vector的容量(包括已使用的空间和未使用的空间)

(4)empty()   //返回vector是否为空,若容器为空,则返回true,否则返回false

(5)front()    //返回第一个元素的引用

(6)back()    //返回最后一个元素的引用

(7)push_back()    //在vector末尾插入新的元素

(8)pop_back()     //删除最后一个元素

(9)erase()       //删除某位置上的元素,返回被删除位置的下一个位置

例如:

int main()
{
    vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    
    Show(vec);

    vector<int>::iterator itr=vec.end();
    itr--;
    cout<<*(vec.erase(itr))<<endl;
}

结果:

技术分享

另外,在对vector进行插入、删除时会造成迭代器的失效问题(被查删除位置的迭代器已经不能进行任何的运算),因此,删除vector中的某个元素的正确程序:

int main()
{
    vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    vec.push_back(2);

    Show(vec);

    vector<int>::iterator itr=vec.begin();

    //删除元素2
    while(itr!=vec.end())
    {
        if(*itr==2)
            itr=vec.erase(itr);
        else
            itr++;
    }

    Show(vec);
}

结果如下:

技术分享

 

Vector的相关知识

标签:

原文地址:http://www.cnblogs.com/acode/p/4619259.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!