「数组」C++STL库vector(动态数组|向量)全部函数介绍

概述

vector 是一种C++标准模板库STL中定义的一种序列容器,它允许你在运行时动态地插入和删除元素。

vector 是基于数组的数据结构,但它可以自动管理内存,这意味着你可以添加任意多的元素在其中,并且你不需要手动分配和释放内存。

它同时具有动态类型和数组的特性:

动态大小:内存空间可以根据需要自动增长和缩小。

连续存储:元素在内存中是连续存储的,这使得访问元素非常快速。

可迭代:可以被迭代,你可以使用循环来访问它的元素。

元素容器:可以存储任何类型的元素,包括基本类型、对象、指针等。

接下来,我们介绍vector类型定义的全体成员函数。

容器创建

STL库提供了以下方式创建一个vector。

T表示任意类型。

无参构造vector<T>vec();生成一个存储T类型的动态数组vector。
提供初始空间的构造vector<T>vec(int num);生成初始长度为num的vector,初值为0。
提供初始长度和初值的构造vector<T>(int num,T target);生成初始长度为num的vector,初值为target。
提供源数据地址的构造

vector<T>vec(T*begin,T*end);


vector<T>vec(vector<T>::iterator begin,vector<T>::iterator begin);

从定长数组begin到end之间获取数据初始化。

从vector容器的迭代器(容器指针)之间初始化。

拷贝构造vector<T>vec(vector<T>another);将another整体赋值给新vector。
vector<int>a;//{}
vector<int>b(3); //{0,0,0,}
vector<int>c(3,5);//{5,5,5,}
int x[] = {1,2,3,4,5,6};
vector<int>d(x,x+6);//{1,2,3,4,5,6,}
vector<int>vec(d);//{1,2,3,4,5,6,}

数据控制 

vector类型通过成员函数维护数据。

尾部压入

push_back(T elem);在尾部加入元素
尾部弹出pop_back();删除尾部最后一个元素
插入insert(vector<T>::iterator it,T elem);在迭代器it(后文提及)指向的位置加入元素,原元素依次向后移动
删除erase(vector<T>::iterator it);删除it指向的元素
交换swap(vector<T>&another);

交换两个容器的元素

清空clear();清空元素
再分配assign();参数与后三种构造相同重新初始化vector,方法与后三种构造函数一致
尾部安置(C++11)emplace_back(T elem);由C++11后可用,在尾部原地构造一个元素,作用与push_back()相同,但没有赋值过程而是原地生成新元素,所以效率更高
头部安置(C++11)emplace_front(T elem);与empalce_back()类似
插入安置(C++11)emplace(vector<T>::iterator it,T elem);作用于insert相同,但因为上述原因效率更高

数据访问

 vector同时提供了类形式的函数访问和数组形式的运算符访问

重载[]号访问operator[](int pos);

模仿定长数组的数据访问形式,如arr[3]=5;

vector因此使用起来与定长数组无异。

成员函数式访问at(int pos);返回pos处元素的引用。它实际与[]号相同。
访问头元素front();返回头元素。
访问尾元素back();返回尾元素。
直接访问底部(C++11)data();

返回vector维护的底部数组的头地址。

(vector是基于数组这种数据类型的容器,它的所有操作都是在维护他的成员指针指向的定长数组)

//d的内部:{1,2,3,4,5,6,}
d.at(2) = 7;
d.front() = 9;
d.back() = 8;
for (int i = 0; i < 6; i++)cout << d[i];//输出927458
int* p = d.data();//p得到了头元素d[0]的地址
cout << *p;//输出9

迭代器

迭代器是c++STL库提供的指向容器的类型,有着类似指针的作用。

通常定义vector<T>::iterator it=.....来获得一个指向某处的it迭代器。

头位置begin();返回头位置(vector第一个元素的位置,vector为空时和end相等)。
尾位置end();返回尾位置。(它指向的位置是第一个不属于vector的位置而不是vector的最后一个元素。)
常量头位置cbegin();返回头位置,赋值给const_iterator类型。这种迭代器不可修改容器。
常量尾位置cend();返回常量尾位置。
逆序头位置rbegin();返回逆序头位置,赋值给reverse_iterator类型。指向最后一个元素(与end不同),对逆序迭代器的++操作会使其向头部移动,--向尾部移动(与正序相反)
逆序尾位置rend();返回逆序尾位置,指向vector前面的那个不属于vector的位置(与front不同)
常量逆序头位置crbegin();返回常量逆序头位置,赋值给const_reverse_iterator类型。
常量逆序尾位置crend();返回常量逆序尾位置。
//d的内部:{1,2,3,4,5,6,}
for (vector<int>::const_iterator cit = d.begin(); cit != d.end(); cit++)
cout << *cit;
//输出123456for (vector<int>::const_reverse_iterator crit = d.crbegin(); crit != d.crend(); crit++)
cout << *crit;
//输出654321

内存管理

vector不仅可以自动管理内部空间,还支持程序员手动管理内部空间

vector内部关于内存同时拥有size和capacity两种参数,为什么?

试想:每次申请长度都只是当前长度+1,则会在内存空间中反复向后利用函数申请新空间来维护数据,这同时耗费了时间和空间。

那么如果每次都申请真实长度size的两倍空间capacity,则每次申请后都有一段空闲区域容纳新元素,此时不需要申请新空间,只有当再次填满时才申请新空间,则减少了时间成本,提高了空间利用率。

获取实际长度size();返回vector中的有效元素个数。
控制实际长度

resize(int num);


resize(int num,T target);

将有效元素限制到num个。size>num时抛弃多余部分;num>size则将将多出的位置置为target,无target时置为0.
获取真实空间大小capacity();获取vector维护的底层数组的全部容量。
控制真实空间reserve(int num);num>capacity时扩容,否则无事发生。
判断是否为空empty();size==0时返回true,否则返回false。
空间收缩shrink_to_fit();将capacity收缩至size大小。
获取整个程序的极限容纳空间max_size();返回整个程序支持的理论最大vector长度。

Tips

vector<bool>不是装载bool类型的标准vector容器,这个奇异搞笑的类型不是vector<T>的一个实现,它就叫"vector<bool>",常年被c++标准委员会诟病。它本来是用来演示如何使用STL库的一个小白鼠,存储bool这个bit大小的元素,在一个字节上存了八个。它的运行效率极低,不推荐使用。

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

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

相关文章

CTF Web SQL注入 10000字详解

这里写目录标题 涉及的数据库知识unionorder bydatabase()information_schemalimit--空格注释replaceinto outfilelikeGROUP BYHAVINGGROUP BY、HAVING、WHERE之间的关系regexp 原理信息收集操作系统数据库判断注入点注入点类型POST注入数字型注入字符型注入搜索型注入Insert/u…

数学中的连分式、无穷连根式、平方根

连分式 连分式&#xff08;continued fraction&#xff09;由和与倒数的多层嵌套构成&#xff0c;可以是有限的&#xff0c;也可以是无限的。 表达式&#xff1a;或 import mathdef fraction_to_continued_fraction(numerator, denominator, max_terms):"""计算…

【无标题】web+http协议+nginx搭建+nginx反向代理(环境准备)

一&#xff0e;Web 为用户提供互联网上浏览信息的服务&#xff0c;web服务是动态的&#xff0c;可交互的。 1.安装httpd yum -y install httpd 2.启动 systemctl start httpd 3.关闭防火墙 systemctl stop firewalld [rootrs html]# echo "我手机号是" > …

zeppline 连接flink 1.17报错

Caused by: java.io.IOException: More than 1 flink scala jar files: /BigData/run/zeppelin/interpreter/flink/zeppelin-flink-0.11.1-2.12.jar,/BigData/run/zeppelin/interpreter/flink/._zeppelin-flink-0.11.1-2.12.jar 解决方案&#xff1a; 重新编译zepplin代码&…

如何在 cPanel 上更改主共享 IP 地址

cPanel & WHM的主共享IP地址是服务器上新建虚拟主机账户时的默认IP地址。这使得主机服务商能够轻松创建新账户&#xff0c;并简化原本复杂且耗时的域名和网络服务器配置过程。但如果你想更改cPanel服务器的主共享IP地址&#xff0c;该怎么办呢&#xff1f; 本文将概述更改服…

PHP经销商订货管理系统小程序源码

经销商订货管理系统&#xff1a;重塑供应链效率的利器 &#x1f680; 开篇&#xff1a;解锁供应链管理的新纪元 在竞争激烈的商业环境中&#xff0c;经销商作为供应链的关键一环&#xff0c;其订货效率直接影响到整个供应链的流畅度和响应速度。传统的订货方式往往繁琐、易出…

Kylin与Spark:大数据技术集成的深度解析

引言 在大数据时代&#xff0c;企业面临着海量数据的处理和分析需求。Kylin 和 Spark 作为两个重要的大数据技术&#xff0c;各自在数据处理领域有着独特的优势。Kylin 是一个开源的分布式分析引擎&#xff0c;专为大规模数据集的 OLAP&#xff08;在线分析处理&#xff09;查…

精品PPT | 云原生大数据平台构建及落地实践.pptx

1、监控和可观测性的关系及渊源 2、当前阶段落地可观测性的挑战在哪里 3、落地好一个可观测系统的三大要素 4、面向故障处理过程的可观测性体系建设案例 5、思考&#xff1a;人工智能2.0对可观测性技术和产品演进的影响

YOLO入门教程(一)——训练自己的模型【含教程源码 + 故障排查】

目录 引言前期准备Step1 打标训练Step2 格式转换Step3 整理训练集Step4 训练数据集4.1创建yaml文件4.2训练4.3故障排查4.3.1OpenCV版本故障&#xff0c;把OpenCV版本升级到4.0以上4.3.2NumPy版本故障&#xff0c;把NumPy降低版本到1.26.44.3.3没有安装ultralytics模块4.3.4Aria…

Web 安全:Memcached 未授权访问漏洞.(11211端口)

Web 安全&#xff1a;Memcached 未授权访问漏洞 Memcached 是一套常用的 key-value 缓存系统&#xff0c;由于它本身没有权限控制模块&#xff0c;所以对公网开放的 Memcache 服务很容易被攻击者扫描发现。然而 Memcached 的默认配置&#xff0c;11211 端口 不需要密码即可访问…

ROUND() Function in SQL(四舍五入)

ROUND() Function in SQL ROUND() 函数用于将数值四舍五入到指定的小数位数或者整数位数。 不同的数据库系统可能会有一些细微的语法差异&#xff0c;但基本功能都是一致的。 1. 基本语法 ROUND(number, decimal_places)number: 要进行四舍五入的数值。decimal_places: 可选参…

Spring事件监听的核心机制及其原理

Spring事件监听 Spring的事件监听机制主要由三大核心部分组成即事件&#xff0c;监听器和播放器三部分组成。 事件的发布是通过spring当中的pulishEvent方法实现。事件监听实现是通过监听器监听了对应事件的监听器来实现的。 事件监听的作用&#xff1a;为系统业务之间进行一…

1、AI测试辅助-提示词优化

AI测试辅助-提示词优化 一、基本规则二、提示词优化技巧&#xff1a;2.1 Prompt 逆向工程2.2 提示词框架2.2.1 CO-STAR 框架 2.3 提示词生成器 三、总结 一、基本规则 写提示词有个通用的基本规则&#xff0c;遵循这个规则基本上能解决大部分的问答&#xff1a; 角色任务要求 …

2024经济师考试报名『注册流程』图解!

⏰报名时间&#xff1a;8月12日—9月11日 ☑️报名注册流程 1、经济师考试报名注册网站&#xff1a;中国人事考试网. 2、点击考生登录栏目中的【新用户注册】按钮&#xff0c;进行注册。 3、进入用户注册界面&#xff0c;填写注册信息。 4、填写完毕确认无误后点击【提交】&…

thinkPHP开发的彩漂网站源码,含pc端和手机端

源码简介 后台thinkPHP架构,页面程序双分离,Mysql数据库严谨数据结构、多重数据审核机制、出票机制和监控机制,html5前端技术适用移动端,后台逻辑更多以server接口可快捷实现对接pc和ap,下载会有少量图片素材丢失,附件有下载说明前端demo账户密码和后台管理地址管理员账户密码…

【C++】C++11的新特性 --- lambda表达式 ,新的类功能,模块的可变参数 , emplace系列接口

如果你停止,就是谷底! 如果你还在继续,就是上坡! 这是我听过关于人生低谷最好的阐述。 -- 刘同 C11的新特性 1 lambda表达式1.1 基本用法1.2 细谈参数列表与捕捉列表 2 新的类功能2.1 移动构造与移动赋值2.2 default和delete 3 模块的可变参数4 emplace系列接口Thanks♪(&…

C语言:指针(1)

一. 内存和地址 比如&#xff0c;我们的内存就相当⼀栋宿舍楼&#xff0c;楼里有很多的房间&#xff0c;每个房间都有一个房间号&#xff0c;每个房间里都住着8个人。这时如果你的朋友想要来找你&#xff0c;我们只需要把房间号告诉他就能快速的找到我们。 然而&#xff0c;&…

Stable Diffusion 提示词攻略

一、提示词作用 提示词所做的工作是缩小模型出图的解空间&#xff0c;即缩小生成内容时在模型数据里的检索范围&#xff0c;而非直接指 定作画结果。 提示词的效果也受模型的影响&#xff0c;有些模型对自然语言做特化训练&#xff0c;有些模型对单词标签对做特化训练&#xf…

电脑本地如何安装MySQL服务

嗨&#xff0c;我是兰若姐姐&#xff0c;今天给大家说下如何在自己电脑本地安装MySQL服务 &#xff08;一&#xff09;假设你使用的是Windows操作系统&#xff1a; 步骤1&#xff1a;下载MySQL安装包 打开浏览器&#xff0c;访问MySQL官网&#xff1a;MySQL官网下载页面选择…