【导读】:vector是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,vector是一个能够存放任意类型的动态数组。接下来,请跟随小编一起来复习一下吧。

以下是正文


前言

本文mark了vector的一些接口,介绍了vector中的对内存和对象的管理详解请见cppreference-vector。

1. vector内部管理着一块内存,压入对象的时候,会使用这块内部的内存使用placement new去进行对象的生成,而释放对象的时候,显式的去调用析构函数去释放对象。

2. size代表vector中的实际含有元素数量,而capacity表示容量。

3. resize()调整size的时候会生成或释放元素,释放的本质只是调用了析构,但是那块内存块还在vector中。

4. reserve()调整capacity的时候只会增大但是不会减小。

5. push_back()同时支持copy构造&和移动语义构造&&,配合std::move或者std::forward效果更佳。

6. earse()用来删除元素,参数是迭代器, 范围删除的时候是前闭后开【 )。

7. emplace()相当于insert(),但是其通过参数包和模板偏特化减少了一次拷贝构造的过程。

正文

2.1 vector基本布局

一个简单的vector,我们可以理解成如下形式,主要是举了reserve()和resize()这两个例子,来举例vector是如何分配内存,创建初始化对象的,以及析构对象的;

vector内部管理着一块内存,当需要push_back对象的时候,会使用这块内部的内存使用placement new去进行对象的生成,而释放对象的时候,显示的去调用析构函数去释放对象(这只是一种理解,实际实现不一定如此,但是原理上大同小异)

template<class T>class vector{    public:        unsigned char *buffer;        int size_;        int capacity_;        T value_type;         //分配内存        void reserve(int capacity){           if(capacity > capacity_){//创建一块新内存放过去                unsigned char * temp = malloc(sizeof(value_type) * capacity);                 memcpy(temp, buffer, capacity_);                capacity_ = capacity;                free(buffer);                buffer = temp;           }        }          //调整元素        void resize(int size){            int duration = sizeof(value_type);            if(size > size_){                for(int i = size_ ; i < size ;   i){                    T *obj = new(buffer[i*duration])T();//使用buffer[i * duration]内存块去创建对象                }            }            else{                for(int i = size_ -  1; i >= size ; --i){                    T *obj = (T*) buffer[ i* duration];                    obj->~T();//调用析构}            }        }};

2.2 constructor

基本构造函数

有四种如下的方式,其中特别注意使用iterator的方式进行copy construct的时候,也可以直接传递数组地址过去,会自动转换

// constructors used in the same order as described above:  std::vector<int> first;                                // empty vector  std::vector<int> second (4,100);                       // four ints with value 100  std::vector<int> third (second.begin(),second.end());  // iterating through second  std::vector<int> fourth (third);                       // a copy of third
// the iterator constructor can also be used to construct from arrays:  int myints[] = {16,2,77,29};  std::vector<int> fifth (myints, myints   sizeof(myints) / sizeof(int) );

列表初始化

可以使用c 11的列表初始化进行快速初始化

vector a{{1}, {2}, {3}};    //加不加括号都一样vector a={{1}, {2}, {3}};

2.3 size()和capacity()

size是指当前vector中含有的元素数量,capacity是指vector中拥有的空间

void resize (size_type n);

调整vector的size, 如果size比当前拥有的大,会创建默认对象进行push_back,如果size比当前的小,会缩小size,但是不缩小capacity,创建和释放会调用构造函数与析构函数

vector v;v.resize(5);    //调整元素个数
void reserve (size_type n);

调整vector的capacity,如果capacity比当前的小,不缩小,反之,则增加capacity

vector v;v.reserve(5);    //调整容量大下
value_type* data() noexcept;

返回内存块的指针首地址

vector v(10);int *p = v.data(); //获取内存块首地址

2.4 element access

reference at (size_type n);

返回对应的位置元素的引用,和[]作用相同,但是会做检查

C vector详解相关推荐

  1. STL 之vector详解

    STL之vector容器详解 vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样 ...

  2. C++ Vector详解

    Vector是STL库中的一种数据结构,本质上而言,Vector是一种动态数组结构,何为动态数组?动态数组指的是,在内存上面是连续地址,但是在每次初始化数组的时候,都事先分配好一大块内存,然后再分配给 ...

  3. C++STL笔记(四):vector详解

    vector结构 一.vector的构造函数和析构函数 二.vector的非更易型操作 三.vector的赋值操作 四.vector用以直接访问元素的各项操作 五.vector的迭代器相关函数 六.v ...

  4. C++ STL之vector详解

    转自http://blog.sina.com.cn/s/blog_9f1c0931010180cy.html Vectors    vector是C++标准模板库中的部分内容,它是一个多功能的,能够操 ...

  5. C++ -- vector详解

    2019独角兽企业重金招聘Python工程师标准>>> 最近在重新学习C++,找到一篇比较好的介绍vector的文章,现记录下来,以下为转载,侵删. 1. 在C++中的详细说明 ve ...

  6. java list 在头部添加6_【Java提高十六】集合List接口详解

    在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...

  7. 【STL详解】stack

    文章目录 前言 一.STL? 二.stack 1. stack的创建 2. stack相关方法 3. 如何对satck进行排序 前言 本篇文章将总结SLT - stack,以及其常用方法. 一.STL ...

  8. Android vector标签 PathData 画图超详解

    此文章来源于https://www.cnblogs.com/yuhanghzsd/p/5466846.html点击打开链接 Android vector标签 PathData 画图超详解 SVG是一种 ...

  9. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

最新文章

  1. Shiro源码学习之二
  2. react组件放在数组中_为什么要在函数组件中使用React.memo?
  3. opencv java 显示图片_【opencv三】利用opencv读取显示图片
  4. .NET 6 Preview 6 Released
  5. “约见”面试官系列之常见面试题之第七十篇之==和===(建议收藏)
  6. consul通过web接口的kv存储操作
  7. 面试官:高并发下重启服务,接口调用老是超时,你有什么解决办法?
  8. linux编译后 空间不足,Linux系统/run/systemd空间不足问题解决
  9. python-gui-pyqt5的使用方法-5--为类增加信号
  10. webpack2.x 中文文档 翻译 之 依赖管理 Dependency Management
  11. sqlmap重要参数详解+用法,解决入门难题
  12. excel组合汇总_Excel汇总20151102
  13. Matlab之数据筛选
  14. 解决方案的四种落地形态
  15. ~杂记(3):los_dispatch.s和startup.s的作用分析
  16. CentOS虚拟机连接外网
  17. 天道酬勤之Java 实例 - 数组获取最大和最小值
  18. Linux中的进程、线程和文件描述符
  19. 软件开发常用工具介绍
  20. 《预言者》:从路人甲到教父的预言之路

热门文章

  1. 反射xss 测试地址_使用反射进行测试
  2. MicroProfile在Jakarta EE时代的作用
  3. jboss7.1.1 部署_在JBoss AS 7上部署BroadleafCommerce 2.0
  4. 使用Spring MVC应用程序配置嵌入式H2控制台
  5. java 迁移数据_从迁移到Java 7的小技巧
  6. 终极Java日志字典:开发人员最常记录的单词是什么?
  7. 有效的Java –所有对象通用的方法
  8. 通过入侵JVM打印阵列
  9. 书评– Kubernetes Up&Running,作者:Kelsey Hightower
  10. Spring Enable批注–编写自定义的Enable批注