C++容器——vector

基本概念:

vector容器功能与数组的功能类似!

提供了动态数组的功能,即大小可以自动调整的数组

使用vector容器需加头文件          #include<vector>


与普通数值的区别:

大小调整:

普通数组:大小固定,一旦声明就需要指定其大小,并且之后无法改变。

vector容器:动态数组,可以在运行时自动调整大小。当元素数量超过当前容量时,vector会自动分配更多的内存以容纳更多元素。自动分配是动态扩展!

动态扩展:不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝到新空间,释放原空间

内存管理:

普通数组:需要手动分配和释放数组所占用的内存,容易引发内存泄漏或越界错误。

vector容器:自动管理内存,包括分配、扩展和释放内存,减少负担,提高了代码的安全性。

初始化与构造:

普通数组:初始化时必须显式给出所有元素的值,或者默认初始化(例如,整型数组默认初始化为0)。

vector容器:提供多种构造方法,如默认构造、用特定数量的元素初始化、用区间内的元素初始化等。

接口丰富性:

普通数组:操作相对有限,主要依赖下标访问和指针算术。

vector容器:作为STL的一部分,提供了丰富的成员函数,如push_back, pop_back, insert, erase, size, empty等,便于元素的添加、删除和查询。

传递给函数:

普通数组:作为函数参数时,通常传递数组的指针(数组名),这使得难以确定数组的大小,且不能直接通过引用修改数组大小。

vector容器:可以按值传递、按引用传递或使用迭代器,更安全且功能更全面,尤其是当需要在函数内部修改容器时,传递引用避免了拷贝整个容器。

效率:

普通数组:由于其固定性和连续性,在已知大小且不需调整的情形下,访问速度可能更快,尤其是在循环遍历等场景。

 vector容器:在某些情况下(如尾部插入和删除)由于连续内存布局可以非常高效,但当需要在中间插入或删除元素时,可能涉及元素的大规模移动。


使用(迭代器):

定义和初始化:

定义:

vector <T> vectorname ;
//实质是类模板

解释:

T     数据类型

vectorname  为vector容器名

举例子:

#include<iostream>
#include<vector>
int main()
{
	std::vector <int> v;
	return 0;
}

初始化:

通过举例子可以很清晰明了的看出

#include<iostream>
#include<vector>
int main()
{
	//列表初始化
	std::vector <int> v1{1,2,3,4} ;
	std::vector <int> v2 = {1,2,3,4};

	//指定大小(默认初始化为0)
	std::vector <int> v3(4);
	
	//指定大小初始化(指定v4有3个元素都为1)
	std::vector <int> v4(3, 1);
	
	//拷贝初始化
	std::vector <int> v5 (v4);
	std::vector <int> v6 { v4 };
	std::vector <int> v7 = v4;
	std::vector <int> v8(v1.rbegin(), v1.rend());//区间拷贝,从末尾到首的拷贝

	return 0;
}

控制元素操作:

添加元素

使用push_back(a)在末尾添加元素a

使用insert(a,b)在指定位置a插入b元素(a为迭代器)

使用insert(a,b,c)在指定位置a插入b个c元素(a为迭代器)

使用emplace(a,b)在指定位置a插入元素b(就地构造)(a为迭代器)

使用emplace_back(a)在末尾添加元素a(就地构造)

[就地构造]:是一种直接在最终存储位置创建对象的技术。这种技术可以避免额外的复制或移动操作,从而提高效率和资源利用率。

删除元素

使用pop_back()删除最后一个元素

使用erase(a)删除指定位置a的元素(a为迭代器)

使用erase(a,b)删除指定范围的元素(a与b为迭代器)

使用clear()删除所有元素

使用resize(int a)减少大小来删除元素

容器操作:  

empty():

此函数用于判断容器是否为空。如果容器为空,则返回true,否则返回false。

size():

此函数返回容器中实际元素的数量,也就是容器的大小。

capacity():

此函数返回当前容器的容量,即在不重新分配内存的情况下,容器最多能容纳多少元素。这与当前元素的实际数量(size)可能不同。

resize(int num):

此函数用于重新指定容器的大小为num。

如果新的大小大于当前大小,容器会被填充默认值初始化的新元素直到达到num(对于内置类型如int,默认值通常是0)。

如果新的大小小于当前大小,容器尾部的元素会被移除,以减小容器的大小到num。

resize(int num, int elem):

这个是重载版本的resize同样用于调整容器大小到num,但当容器需要扩展时,新增的位置会使用指定的elem值进行填充,而不是默认值。

swap(n):

交换当前容器和容器n

数据存取:

[n]: 返回对容器中位置为 n 的元素的引用。(普通数组的访问数据方式在vector容器中也适用)

at(n): 返回对容器中位置为 n 的元素的引用,并进行边界检查。

front(): 返回对容器中第一个元素的引用。

back(): 返回对容器中最后一个元素的引用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【莫比乌斯变换-04】求解莫比乌斯变换系数

求解莫比乌斯变换系数 文章目录 一、说明二、如何确定双线性变换系数2.1 变换基本形式2.2 通过三点确定 三、一般情况的变换3.1 最简单的情况&#xff1a;无穷大3.2 处理无穷大 四、Python 代码 一、说明 上一篇文章是对双线性变换的视觉介绍&#xff0c;又名莫比乌斯变换或分…

ThreeJS:补间动画与Tween.JS

补间动画 补间动画指的是做FLASH动画时&#xff0c;在两个关键帧中间需要做“补间动画”&#xff0c;才能实现图画的运动&#xff1b;插入补间动画后两个关键帧之间的插补帧是由计算机自动运算而得到的。 ——摘自《百度百科&#xff1a;补间动画_百度百科》 Tween.js Tween.js…

Python-VBA函数之旅-oct函数

目录 一、oct函数的常见应用场景 二、oct函数使用注意事项 三、如何用好oct函数&#xff1f; 1、oct函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、oct函数的常见应用场景 oc…

W801学习笔记十七:古诗学习应用——上

硬件驱动以及软件架构大体上已经完成&#xff0c;尚存一些遗漏之处&#xff0c;后续会寻找合适的时机进行补充。自此章起&#xff0c;将正式迈入软件应用阶段&#xff0c;尤其是游戏开发领域。 关于第一个应用&#xff0c;此前已有一些构想&#xff1a; 其一&#xff0c;随机…

IO流-其他流:数据流,序列化流

import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream;public class DataOutputStream1 {public static void main(String[] args) {//创建一个数据输出流包装一个低级的字节输出流try (DataOutputStream dosnew DataOutp…

9.3.k8s的控制器资源(deployment部署控制器)

目录 一、deployment部署控制器概念 二、deployment资源的清单编写 三、小结 功能 使用场景 原理 四、deployment实现升级和回滚 1.编辑deployment资源清单&#xff08;v1版本&#xff09; 2.创建service资源用于访问 ​编辑 3.修改deploy清单中pod镜像版本为V2 4…

「C/C++ 01」scanf()与回车滞留问题

目录 〇、scanf()接收用户输入的流程 一、回车的缓冲区滞留问题是什么&#xff1f; 二、为什么&#xff1f; 三、四个解决方法&#xff1a; 1. 在前面的scanf()中加上\n 2. 在scanf("%c")中添加空格 3. 使用getchar()来吸收回车 4. 使用fflush()清空缓冲区 〇、scan…

2.spring security 简单入门

创建springboot 项目&#xff0c;引入spring security坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--spring security坐标--><dependency&g…

leecode每日一练

我一开始的思路也是dp&#xff0c;但是转移方程想错了&#xff0c;这个题目转移方程应该是dp[i] max(dp[i-2]nums[i],dp[i-1]) class Solution { public:int rob(vector<int>& nums) {int len nums.size();vector<int> dp(len);int ans 0;if(len>1)dp[0]…

IoTDB 入门教程 基础篇①——时序数据库为什么选IoTDB ?

文章目录 一、前文二、性能排行第一三、完全开源四、数据文件TsFile五、乱序数据高写入六、其他七、参考 一、前文 IoTDB入门教程——导读 关注博主的同学都知道&#xff0c;博主在物联网领域深耕多年。 时序数据库&#xff0c;博主已经用过很多&#xff0c;从最早的InfluxDB&a…

《Fundamentals of Power Electronics》——脉宽调制器建模

下图给出了一个简单脉宽调制器电路的原理图。 脉宽调制器电路产生一个用于指令转换器功率管导通和关断的逻辑信号δ(t)。该逻辑信号δ(t)是周期性的&#xff0c;其频率为fs&#xff0c;占空比为d(t)。脉宽调制器的输入是一个模拟控制信号vc(t)。脉宽调制器的作用是产生一个与模…

观测与预测差值自动变化系统噪声Q的自适应UKF(AUKF_Q)MATLAB编写

简述 基于三维模型的UKF&#xff0c;设计一段时间的输入状态误差较大&#xff0c;此时通过对比预测的状态值与观测值的残差&#xff0c;在相应的情况下自适应扩大系统方差Q&#xff0c;构成自适应无迹卡尔曼滤波&#xff08;AUKF&#xff09;&#xff0c;与传统的UKF相比&…

【人工智能Ⅱ】实验5:自然语言处理实践(情感分类)

实验5&#xff1a;自然语言处理实践&#xff08;情感分类&#xff09; 一&#xff1a;实验目的与要求 1&#xff1a;掌握RNN、LSTM、GRU的原理。 2&#xff1a;学习用RNN、LSTM、GRU网络建立训练模型&#xff0c;并对模型进行评估。 3&#xff1a;学习用RNN、LSTM、GRU网络做…

递归、搜索与回溯算法:记忆化搜索

例题一 解法&#xff08;暴搜 -> 记忆化搜索 -> 动态规划&#xff09;&#xff1a; 算法思路&#xff1a; 暴搜&#xff1a; a. 递归含义&#xff1a;给 dfs ⼀个使命&#xff0c;给他⼀个数 n &#xff0c;返回第 n 个斐波那契数的值&#xff1b; b. 函数体&…

JVM知识总汇(JVM面试题篇5.1)

个人理解&#xff0c;所学有限&#xff0c;若有不当&#xff0c;还请指出 1.JVM是由哪些部分组成&#xff0c;运行流程是什么&#xff1f; JVM为java虚拟机&#xff0c;是java程序的运行环境&#xff08;其实是java字节码文件的运行环境&#xff09;&#xff0c;能够实现一次编…

idea中使用GlassFish服务器启动项目

idea中使用GlassFish服务器进行测试 1.项目背景 当前在研究openMDM项目, 不过该项目不是springboot项目, 并且是使用GlassFish进行war部署的, 但是需要在idea中进行项目的二次开发,故需要进行idea启动项目并且进行开发和调试 2.GlassFish是什么 GlassFish是一个web服务器, …

分层解耦-三层架构

一、使用三层架构的原因 如果所有代码都写在controller类的方法中&#xff0c;这里面包含了数据访问的代码、逻辑处理的代码、接收请求和响应数据的代码&#xff0c;如图示例: 而我们在进行软件设计以及软件开发的时候&#xff0c;要尽量让每一个接口、类或者方法的职责更加单…

深入理解分布式事务⑧ ---->MySQL 事务的实现原理 之 MySQL 事务流程(MySQL 事务执行流程 和 恢复流程)详解

目录 MySQL 事务的实现原理 之 MySQL 事务流程&#xff08;MySQL 事务执行流程 和 恢复流程&#xff09;详解MySQL 事务流程1、MySQL 事务执行流程1-1&#xff1a;MySQL 事务执行流程如图&#xff1a; 2、MySQL 事务恢复流程2-1&#xff1a;事务恢复流程如下图&#xff1a; MyS…

西门子V90参数移植方法

西门子V90参数移植方法 应用方面 由于设备老化损坏&#xff0c;需要更换V90驱动器&#xff0c;但是由于新驱动器与旧驱动器出现版本不一样时参数就会无法直接下载到新的驱动器里面&#xff0c;为了保证更换驱动器的稳定性最好能使用之前设备的参数&#xff0c;所以写了关于V9…

车载电子电器架构 —— 如何理解和使用Update bit

车载电子电器架构 —— 如何理解和使用Update bit 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不…
最新文章