C vector详解
【导读】: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详解相关推荐
- STL 之vector详解
STL之vector容器详解 vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样 ...
- C++ Vector详解
Vector是STL库中的一种数据结构,本质上而言,Vector是一种动态数组结构,何为动态数组?动态数组指的是,在内存上面是连续地址,但是在每次初始化数组的时候,都事先分配好一大块内存,然后再分配给 ...
- C++STL笔记(四):vector详解
vector结构 一.vector的构造函数和析构函数 二.vector的非更易型操作 三.vector的赋值操作 四.vector用以直接访问元素的各项操作 五.vector的迭代器相关函数 六.v ...
- C++ STL之vector详解
转自http://blog.sina.com.cn/s/blog_9f1c0931010180cy.html Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操 ...
- C++ -- vector详解
2019独角兽企业重金招聘Python工程师标准>>> 最近在重新学习C++,找到一篇比较好的介绍vector的文章,现记录下来,以下为转载,侵删. 1. 在C++中的详细说明 ve ...
- java list 在头部添加6_【Java提高十六】集合List接口详解
在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...
- 【STL详解】stack
文章目录 前言 一.STL? 二.stack 1. stack的创建 2. stack相关方法 3. 如何对satck进行排序 前言 本篇文章将总结SLT - stack,以及其常用方法. 一.STL ...
- Android vector标签 PathData 画图超详解
此文章来源于https://www.cnblogs.com/yuhanghzsd/p/5466846.html点击打开链接 Android vector标签 PathData 画图超详解 SVG是一种 ...
- c++中vector的用法详解
c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...
最新文章
- Shiro源码学习之二
- react组件放在数组中_为什么要在函数组件中使用React.memo?
- opencv java 显示图片_【opencv三】利用opencv读取显示图片
- .NET 6 Preview 6 Released
- “约见”面试官系列之常见面试题之第七十篇之==和===(建议收藏)
- consul通过web接口的kv存储操作
- 面试官:高并发下重启服务,接口调用老是超时,你有什么解决办法?
- linux编译后 空间不足,Linux系统/run/systemd空间不足问题解决
- python-gui-pyqt5的使用方法-5--为类增加信号
- webpack2.x 中文文档 翻译 之 依赖管理 Dependency Management
- sqlmap重要参数详解+用法,解决入门难题
- excel组合汇总_Excel汇总20151102
- Matlab之数据筛选
- 解决方案的四种落地形态
- ~杂记(3):los_dispatch.s和startup.s的作用分析
- CentOS虚拟机连接外网
- 天道酬勤之Java 实例 - 数组获取最大和最小值
- Linux中的进程、线程和文件描述符
- 软件开发常用工具介绍
- 《预言者》:从路人甲到教父的预言之路
热门文章
- 反射xss 测试地址_使用反射进行测试
- MicroProfile在Jakarta EE时代的作用
- jboss7.1.1 部署_在JBoss AS 7上部署BroadleafCommerce 2.0
- 使用Spring MVC应用程序配置嵌入式H2控制台
- java 迁移数据_从迁移到Java 7的小技巧
- 终极Java日志字典:开发人员最常记录的单词是什么?
- 有效的Java –所有对象通用的方法
- 通过入侵JVM打印阵列
- 书评– Kubernetes Up&Running,作者:Kelsey Hightower
- Spring Enable批注–编写自定义的Enable批注