C++STL序列式容器---vector和list常用的接口用法以及vector和list的区别

序列式容器


一. vector :
vector采用一段连续的内存来存储其元素,向vector添加元素的时候,如果容量不足,vector便会重新malloc一段更大的 
内存,然后把原内存中的数据memcpy到新的内存中,并free原内存块,然后将新元素加入。 
vector的元素插入性能跟以下几个要素关系重大:

    1. 插入的位置

       头部插入:将所有元素后移,然后将新元素插入
       中间插入:将插入点后面的元素后移,然后插入新元素  
       尾部插入:将新元素直接插入尾部

       总结:
            尾部插入无疑是最快的,头部插入最慢,中间插入次之,(尾部插入>中间插入>头部插入)
            慢的原因:在于插入前要移动后面的所有元素。删除元素也是同样的道理。

   2. 保留空间大小

      如果插入元素是,空间不足将导致重新malloc以及一系列的内存拷贝。如果使用者能对容量有预期, 
      那么采用reserve()来预先分配内存,将大大的提高性能。 

  综述,vector适用于尾部插入,但是此时无法兼顾查找的性能,因为二分查找的vector要求重新排序, 
  或者要求vector在插入时就保持有序,这样就无法做到尾部插入。

  但是vector作为动态数组的替代,已经足够优秀。
常用接口:

头文件: #include <vector>

//1.定义和初始化

     vector<int> vec1;                           // 默认初始化,vec1为空
     vector<int> vec2(vec1);                     // 使用vec1初始化vec2
     vector<int> vec3(vec1.begin(),vec1.end());  // 使用vec1初始化vec2
     vector<int> vec4(10);                       // 10个值为0的元素
     vector<int> vec5(10,4);                     // 10个值为4的元素

//2.常用操作方法 

     vec1.push_back(100);                       // 尾部添加元素
     int size = vec1.size();                    // 元素个数
     bool isEmpty = vec1.empty();               // 判断是否为空
     cout<<vec1[0]<<endl;                       // 取得第一个元素
     vec1.insert(vec1.end(),5,3);               // 从vec1.back位置插入5个值为3的元素
     vec1.pop_back();                           // 删除末尾元素
     vec1.erase(vec1.begin(),vec1.begin()+2);   // 删除vec1[0]-vec1[2]之间的元素,不包括vec1[2](左闭右开)
     cout<<(vec1==vec2)?true:false;              // 判断是否相等==、!=、>=、<=...
     vector<int>::iterator iter = vec1.begin();          // 获取迭代器首地址
     vector<int>::const_iterator c_iter = vec1.begin();   // 获取const类型迭代器
     vec1.clear();                                // 清空元素

//3.遍历

    // 1. 下标法
    int length = vec1.size();
    for(int i=0;i<length;i++)
    {
       cout<<vec1[i]<<" ";
    }
    cout<<endl;

    // 2. 迭代器法
    vector<int>::iterator iter = vec1.begin();
    for(;iter != vec1.e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值