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);

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arcgis 出图背景_ArcGIS空间制图分析视频教程(二狮兄出品)含ArcMap

这套教程是二狮兄出的一套ArcGIS地理空间制图数据分析视频教程&#xff0c;含ArcMap/ArcCatalog部分。教程分为上中下三部&#xff0c;已全部录制完毕&#xff0c;全部课程120节。适用人群ArcGIS目前的应用范围非常广泛&#xff0c;包括但不限于从事地理景观、生态环境、规划设…

C 之父:C 的成功属于意料之外,C 11是转折点

C 的起源可以追溯到 40 年前&#xff0c;但它仍然是当今使用最广泛的编程语言之一。到 2020 年 9 月为止&#xff0c;C 是仅次于 C 语言、Java 和 Python&#xff0c;位于全球第四的编程语言。根据最新的 TIOBE 索引&#xff0c;C 也是增长最快的语言。近日&#xff0c;C 之父 …

aix磁盘挂载到linux,AIX下文件系统挂载点相互调换方案

由于业务发展的需要&#xff0c;企业在异地实现了数据块级的灾备&#xff0c;由于原来的备份目录lv所在VG恰好在远程灾备VG内(该方案实现的是vg级别的数据同步)&#xff0c;为了节省带宽所以又从存储上新划分出一块磁盘新建了一个vg作为备份空间使用。但是由于当时厂商在创建vg…

苹果几最好用_深度解析安卓手机和苹果手机到底有哪些区别,哪种手机最好用...

"安卓阵营手机和苹果手机一直是手机界多年的竞争对手。由于安卓系统是开源的系统&#xff0c;任何厂家都能使用它。而导致安卓系统全球碎片化的主要原因是大部分国产品牌手机都没有安装谷歌服务&#xff0c;对于外国人的来说安装了谷歌服务的安卓手机才是完整的。然而中国…

linux设置基础软件仓库时,安装centos系统时设置基础软件仓库出错

安装centos系统时设置基础软件仓库出错,公钥,命令,视频教程,器上,提示安装centos系统时设置基础软件仓库出错易采站长站&#xff0c;站长之家为您整理了安装centos系统时设置基础软件仓库出错的相关内容。1、首先登录CentOS服务器&#xff0c;连接上服务器之后我们使用yum remo…

C 11实现的100行线程池

【导读】&#xff1a;C 线程池一直都是各位程序员们造轮子的首选项目之一。今天&#xff0c;小编带大家一起来看看这个轻量的线程池&#xff0c;本线程池是header-only的&#xff0c;并且整个文件只有100行&#xff0c;其中C 的高级用法有很多&#xff0c;很值得我们学习&#…

tensorflow2 目标检测_基于光流的视频目标检测系列文章解读

作者&#xff1a;平凡的外卖小哥全文5747字&#xff0c;预计阅读时间15分钟1 简介目前针对于图片的目标检测的方法大致分为两类&#xff1a;faster R-CNN/R-FCN一类&#xff1a;此类方法在进行bbox回归和分类之前&#xff0c;必须通过region proposal network(RPN)得到RoI&…

sts集成jboss_如何为JBoss Developer Studio 8设置集成和SOA工具

sts集成jboss最新的JBoss Developer Studio&#xff08;JBDS&#xff09;的发布带来了有关如何开始使用尚未安装的各种JBoss Integration和BPM产品工具集的问题。 在本系列文章中&#xff0c;我们将为您概述如何安装每套工具并说明它们支持哪些产品。 这将有助于您在着手进行…

C 多线程的互斥锁应用RAII机制

什么是RAII机制RAII是Resource Acquisition Is Initialization&#xff08;翻译成 “资源获取即初始化”&#xff09;的简称&#xff0c;是C 语言的一种管理资源、避免资源泄漏的惯用法&#xff0c;该方法依赖构造函数资和析构函数的执行机制。RAII的做法是使用一个类对象&…

c iostream.源码_通达信《K线上画趋势线预警》精选指标(附源码)

通达信《K线上画趋势线预警》精选指标K线上画趋势线预警源码&#xff1a;N:5;MA5:EMA(C,5)COLORWHITE;MA13:EMA(C,13)COLORCYAN;MA21:EMA(C,21)COLORMAGENTA;MA34:EMA(C,34)COLORYELLOW;MA55:EMA(C,55)COLORRED;{画线}A1:REF(H,N)HHV(H,2*N1);B1:FILTER(A1,N);C1:BACKSET(B1,N1…

linux module原理,NodeJS的模块原理

最近一直在使用Node JS&#xff0c;在网上看到了一段代码我觉得完美的诠释了Node JS模块加载的原理&#xff0c;其实深究下去&#xff0c;它还诠释了许多东西&#xff1a;Js模块化编程、闭包的真正强大之处等等。闲话不说&#xff0c;先看看这段代码&#xff1a;// - hello.jsv…

C 20 协程初探

【导读】&#xff1a;C 20 终于引入了协程特性&#xff0c;给库作者提供了一个实现协程的机制&#xff0c;让用户方便使用协程来编写异步逻辑&#xff0c;降低了异步并发编程的难度。结合我最近协程的学习&#xff0c;在这里记录一下相关内容。以下是正文使用场景协程和普通函数…

如何写一个简单的node.js C 扩展

node 是由 c 编写的&#xff0c;核心的 node 模块也都是由 c 代码来实现&#xff0c;所以同样 node 也开放了让使用者编写 c 扩展来实现一些操作的窗口。如果大家对于 require 函数的描述还有印象的话&#xff0c;就会记得如果不写文件后缀&#xff0c;它是有一个特定的匹配规则…

在线画 有穷状态自动机 的软件_怎么画思维导图?不用下载软件,在线就能操作...

怎么画思维导图&#xff1f;在工作中&#xff0c;除了流程图&#xff0c;脑图也是很重要的一个存在&#xff1a;流程图帮助我们快速完成任务&#xff0c;而脑图告诉我们任务本质。画思维导图是一个积累的过程&#xff0c;急不来&#xff0c;对于新手来说还是有一定难度的。由于…

Spring Boot Actuator:在其顶部具有MVC层的自定义端点

Spring Boot Actuator端点允许您监视应用程序并与之交互。 Spring Boot包含许多内置端点&#xff0c;您也可以添加自己的端点。 添加自定义端点就像创建一个从org.springframework.boot.actuate.endpoint.AbstractEndpoint扩展的类一样容易。 但是Spring Boot Actuator也提供了…

422器件与lvds接收器的区别_SPI、I2C、UART三种串行总线的原理、区别

SPI、I2C、串口、我相信如果你是从事的是嵌入式开发&#xff0c;一定会用到这三种通信协议&#xff0c;串口的话因为和波特率有关&#xff0c;所以一般的CPU或者MCU只会配有两个或者三个串口&#xff0c;而数据的传输&#xff0c;的话SPI和I2C用得会比较多区别&#xff1a;1、U…

C 的 6 种内存顺序,你都知道吗?

原子操作的内存顺序有六个内存顺序选项可应用于对原子类型的操作&#xff1a;1. memory_order_relaxed2. memory_order_consume3. memory_order_acquire4. memory_order_release5. memory_order_acq_rel6. memory_order_seq_cst。除非你为特定的操作指定一个顺序选项&#xff0…

易语言 网页用什么编码_通常提到的编码器是干什么用的

编码器&#xff08;encoder&#xff09;是将信号&#xff08;如比特流&#xff09;或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。编码器把角位移或直线位移转换成电信号&#xff0c;前者成为码盘&#xff0c;后者称码尺&#xff0e;按照读出方式编码器可以分…

如何优雅地实现 C 编译期静态反射

部门请来了软件专家袁英杰咨询师指导我们软件开发&#xff0c;从中我也学到了很多姿势&#xff0c;在此记录下来宝贵的经验。苹果的 mbp 品控真是差劲&#xff0c;写这个东西把 LShift 键 按坏了&#xff0c;真是难受。反射能做什么最近和大师聊软件设计&#xff0c;其中一个点…

香草 jboss 工具_如何为JBoss Developer Studio 8设置BPM和规则工具

香草 jboss 工具最新的JBoss Developer Studio&#xff08;JBDS&#xff09;的发布带来了有关如何开始使用尚未安装的各种JBoss Integration和BPM产品工具集的问题。 在本系列文章中&#xff0c;我们将为您概述如何安装每套工具并说明它们支持哪些产品。 这将有助于您在着手进…