首先来看看vector的模板声明:

template <class T, class Alloc = allocator<T>>
class vector {
    //…
};

  vector接受2个模板参数,其中分配器属于默认参数,当然如果你想使用其他分配器话,得把2个参数都写出来,一般只需写入元素类型即可进行vector模板的实例化,如:

 vector<int> vec;

  vector属于序列式容器。所谓序列式容器,其中的元素都可序,但未必有序。vector与array其实挺像的, 唯一的区别就是array是静态空间,一旦配置了就不能改变。而vector呢,如果分配的空间不足,将会重新配置一块新空间,大小是原空间的2倍,然后将元素一一搬过来,最后释放旧空间。因此,vector比array更灵活。示意图如下:

(图片来自侯捷老师课程《STL与泛型编程》, 侵删)

(重新分配新空间 ,元素转移,释放旧内存)

  顺便提一下vector的迭代器:vector的迭代器其实就是普通指针,由于vector具有连续的地址空间,所以它的迭代器类型支持Random Access iterators,随机存取,可跳跃。由于它的迭代器特性,使得vector中元素如果要实现某些算法时效率极高,如二分搜索系列算法。

  vector常用的元素操作:push_back, pop_back, erase, insert, clear等。我们主要谈谈erase.

erase算法有两个版本:

iterator erase(iterator first, iterator last);     // 清除[first, last)中的所有元素
iterator erase(iterator position);                 // 清除某个位置上的元素

  附一段测试代码(版本为Dev C++5.11):

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    int i;
    vector<, );
    cout << "size = " << iv.size() << endl;                // size = 2
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 2

    iv.push_back();
    cout << "size = " << iv.size() << endl;                // size = 3
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 4

    iv.push_back();
    cout << "size = " << iv.size() << endl;                // size = 4
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 4

    iv.push_back();
    cout << "size = " << iv.size() << endl;                // size = 5
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 8

    iv.push_back();
    cout << "size = " << iv.size() << endl;                // size = 6
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 8

    ; i < iv.size(); i++) {                      // 9  9  1  2  3  4
        cout << iv[i] << ' ';
    }
    cout << endl;

    iv.push_back();
    cout << "size = " << iv.size() << endl;                // size = 7
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 8   

    ; i < iv.size(); i++) {                      // 9  9  1  2  3  4  5
        cout << iv[i] << ' ';
    }
    cout << endl;

    vector<);
    if (ivite != iv.end()){
        iv.erase(ivite);
    }

    cout << "size = " << iv.size() << endl;                // size = 6
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 8

    ; i < iv.size(); i++) {                      // 9  1  2  3  4  5
        cout << iv[i] << ' ';
    }
    cout << endl;

    ivite = find(iv.begin(), iv.end(), );
    if (ivite != iv.end()){
        iv.insert(ivite, 1, );                            // insert算法内部实现比较复杂(不做详谈)如:当备用空间不足,配置新内存的长度
    }                                                      // 旧长度的2倍,或是旧长度+新增元素个数

    cout << "size = " << iv.size() << endl;                // size = 7
    cout << "capacity = " << iv.capacity() << endl;        // capacity = 8

    ; i < iv.size(); i++) {
        cout << iv[i] << ' ';                              // 9  1  7  2  3  4  5
    }
    cout << endl;

    iv.clear();
    cout << "size = " << iv.size() << endl;                // size = 0
    cout << "capacity = " << iv.capacity() << endl;        // capacitu = 8

  return 0;
}

最新文章

  1. linux 中文件权限和磁盘管理、linux服务器项目如何部署
  2. 控制反转容器&amp; 依赖注入模式 ---读感。
  3. android studio 真机调试
  4. QT实现单个EXE文件
  5. logstash ArgumentError: comparison of String with 5 failed
  6. New Year Tree 【DFS序+先段数区间查询修改+二进制保存状态】
  7. ACL2016信息抽取与知识图谱相关论文掠影
  8. 【转载】接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点
  9. Node.js平台的一些使用总结
  10. 在CentOS上安装owncloud企业私有云过程
  11. linq 左连接后实现与主表一对一关系数据
  12. Spring Boot 特性以及代码模板实例
  13. item 12: 把重写函数声明为“override”的
  14. css篇-less,scss 用calc问题
  15. Flask-状态保持-CSRF
  16. mybatis-plus 从2.x到3.x升级指南
  17. VSFTP 服务器配置
  18. Redis之List 列表
  19. Linux时间同步+国内常用的NTP服务器地址
  20. Python学习---列表/元组/字典/字符串/set集合/深浅拷贝1207【all】

热门文章

  1. Immutable 详解
  2. Lua C++ Binding之Lunar, Luna
  3. linux下jdk的安装(tar包)
  4. Nginx泛解析的匹配域名绑定到子目录配置
  5. SQL Server 开发-语法学习
  6. Head First 设计模式之命令模式(CommandPattern)
  7. Ajax服务请求原理 简单总结
  8. MyBatis入门学习教程-MyBatis快速入门
  9. 如何使用openssl生成RSA公钥和私钥对
  10. HTML DOM元素的Dragdrop