C++标准库vector的基础用法总结

C++标准库vector的基础用法总结

文章目录

    • C++标准库vector的基础用法总结
      • vector简介
      • 简单应用
      • push操作
      • pop操作
        • 删除末尾
        • 删除开头
      • 参数传递

vector简介

vector是C++标准模板库(STL)中的一个动态数组模板类,它可以随着元素的添加而自动增长。vector使用连续的内存空间来存储元素,这意味着可以使用下标运算符([])来访问元素,就像使用数组一样高效。然而,与数组不同的是,vector的大小是动态的,可以自动调整以适应添加的元素。

当新元素被添加到vector中时,如果当前容量不足以容纳新元素,vector会自动重新分配内存,通常是分配更大的内存块,并将所有原始元素复制到新的内存块中。这个过程可能会导致一些性能开销,因为需要复制元素和重新分配内存。但是,由于这个自动增长的能力,使用vector可以避免手动管理内存和数组大小的复杂性。

vector还提供了许多有用的成员函数,例如push_back()(添加元素到末尾)、pop_back()(删除末尾元素)、push_front()(添加元素到开头)、pop_front()(删除开头元素)、insert()(在指定位置插入元素)和erase()(删除指定位置的元素)等。

需要注意的是,由于vector使用动态内存分配,因此在处理大量数据或频繁调整大小的情况下,使用vector可能会导致内存碎片化或性能下降。在这种情况下,可以考虑使用其他容器,如dequelistarray等。

简单应用

以下是一个使用vector的简单例子:

#include <iostream>
#include <vector>int main() {// 创建一个空的vectorstd::vector<int> vec;// 使用push_back()添加元素vec.push_back(1);vec.push_back(2);vec.push_back(3);// 遍历vector并输出元素for (int i : vec) {std::cout << i << " ";}std::cout << std::endl;// 使用front()和back()获取第一个和最后一个元素std::cout << "第一个元素是: " << vec.front() << std::endl;std::cout << "最后一个元素是: " << vec.back() << std::endl;// 使用pop_back()删除最后一个元素vec.pop_back();// 再次遍历vector并输出元素std::cout << "删除最后一个元素后的向量: ";for (int i : vec) {std::cout << i << " ";}std::cout << std::endl;return 0;
}

这个例子创建了一个空的vector,使用push_back()添加了三个整数,然后使用循环遍历并输出所有元素。接着,使用front()back()获取第一个和最后一个元素,并使用pop_back()删除最后一个元素。最后,再次遍历并输出修改后的vector

push操作

push_back()函数用于在std::vector的末尾添加一个元素。如果std::vector是空的,push_back()会首先创建一个容量为1的std::vector,然后添加元素。如果std::vector已经有元素,push_back()会增加容量(如果需要的话)并添加新元素到末尾。

pop操作

删除末尾

在C++中,std::vector提供了一个pop_back()函数,用于从尾部删除一个元素。这个函数不会返回被删除的元素,但是你可以通过back()函数来获取它。

下面是一个简单的示例:

#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 获取最后一个元素int last_element = vec.back();std::cout << "最后一个元素是: " << last_element << std::endl;// 删除最后一个元素vec.pop_back();// 再次输出向量,以验证最后一个元素已被删除std::cout << "向量现在包含: ";for (int i : vec) {std::cout << i << " ";}std::cout << std::endl;return 0;
}

运行这个程序,你会看到以下输出:

最后一个元素是: 5
向量现在包含: 1 2 3 4

如你所见,pop_back()函数删除了最后一个元素,而back()函数则返回被删除的元素。

删除开头

std::vector也提供了pop_front()函数,用于从头部删除一个元素。同样,这个函数也不会返回被删除的元素,但你可以使用front()函数来获取它。

例如:

#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 获取第一个元素int first_element = vec.front();std::cout << "第一个元素是: " << first_element << std::endl;// 删除第一个元素vec.pop_front();// 再次输出向量,以验证第一个元素已被删除std::cout << "向量现在包含: ";for (int i : vec) {std::cout << i << " ";}std::cout << std::endl;return 0;
}

运行这个程序,你会看到以下输出:

第一个元素是: 1
向量现在包含: 2 3 4 5

参数传递

在C++中,传递一个std::vector作为函数参数可以通过以下几种方式:

  1. 值传递:这是最直接的方式,但会创建一个新的std::vector对象。
void func(std::vector<int> vec) {// 函数体
}
  1. 引用传递:这种方式可以避免复制,并且可以修改原始的std::vector
void func(std::vector<int>& vec) {// 函数体
}
  1. const引用传递:这种方式既可以避免复制,又保证std::vector在函数内不会被修改。
void func(const std::vector<int>& vec) {// 函数体
}
  1. 指针传递:使用指针传递可以避免复制,但需要小心管理内存,因为如果原始的std::vector在函数外部被销毁,指针会变得无效。
void func(std::vector<int>* vec) {// 函数体
}
  1. const指针传递:这种方式与第4点类似,只是保证std::vector在函数内不会被修改。
void func(const std::vector<int>* vec) {// 函数体
}

选择哪种方式取决于你的具体需求。如果不需要修改std::vector,建议使用const引用或const指针传递。如果需要修改,并且希望避免复制,可以使用引用或指针传递。如果你希望避免不必要的内存复制,并且对内存管理有信心,可以选择指针或const指针传递。

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

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

相关文章

蓝桥杯单片机省赛真题

文章目录 第八届蓝桥杯省赛真题及参考代码 链接&#xff1a;https://pan.baidu.com/s/1JQ68qvrU3cYLVaQbD1KSiA?pwd1111 第九届蓝桥杯省赛真题及参考代码 链接&#xff1a;https://pan.baidu.com/s/1LM_JALrsKsthnWxTtgE1Fw?pwd1111 第十届蓝桥杯省赛真题及参考代码 链接&…

[AutoSar]基础部分 RTE 08 runnable mapping

目录 关键词平台说明一、runnable mapping的必要性二、runnable mapping 通用规则三、Task type四、可以不用mapping的runnbale 关键词 嵌入式、C语言、autosar、runnable 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (…

手撕乘积(**Multiplication** **Product**): 穷举和图示(1)

手撕乘积(Multiplication & Product): 穷举和图示(1) 乘积 r ⋅ s ∑ i 1 s r r r ⋯ r ⏟ s times ∑ j 1 r s s s ⋯ s ⏟ r times r\cdot s\sum _{i1}^{s}r\underbrace {rr\cdots r} _{s{\text{ times}}}\sum _{j1}^{r}s\underbrace {ss\cdots s} _{r{\tex…

Spring Boot 进行 MockMvc 单元测试的实例

在Spring Boot应用程序中&#xff0c;使用MockMvc进行单元测试是一种有效的方式&#xff0c;可以验证控制器的行为和API的正确性。在这篇博客中&#xff0c;我们将介绍如何使用MockMvc对用户控制器&#xff08;UserController&#xff09;进行测试&#xff0c;该控制器涉及用户…

数据库单表查询

1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 3、求出所有职工的人数。 4、列出最高工和最低工资。 5、列出职工的平均工资和总工资。 6、创建一个只有职工号、姓名和参加工作的新表&#xff0c;名为工作日期表…

线上问题整理

JVM 案例 案例一&#xff1a;服务器内存不足&#xff0c;影响Java应用 问题&#xff1a; 收到报警&#xff0c;某Java应用集群中一台服务器可用内存不足&#xff0c;超过报警阈值。 排查过程&#xff1a; 首先&#xff0c;通过Hickwall查看该应用各项指标&#xff0c;发现无论…

224.【2023年华为OD机试真题(C卷)】英文输入法(JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-英文输入法二.解题思路三.题解代码Python题解代…

Linux第22步_安装CH340驱动和串口终端软件MobaXterm

开发板输出信息通常是采用串口&#xff0c;而计算机通常是USB接口&#xff0c;为了让他们之间能够交换数据&#xff0c;我们通常采用USB转串口的转换器来实现。目前市场上的串口转换器大多是采用CH340芯片来实现的&#xff0c;因此我们需要在计算中安装一个CH340驱动程序&#…

[代码复现]BrainGNN: Interpretable Brain Graph Neural Network for fMRI Analysis

目录 1. 论文资料 2. 代码复现步骤及可能存在的问题 2.1. 环境配置 2.2. 代码运行 3. 为啥跑这个代码 1. 论文资料 &#xff08;1&#xff09;论文原文&#xff1a;BrainGNN&#xff1a;用于fMRI分析的可解释脑图神经网络 - ScienceDirect &#xff08;2&#xff09;论文…

Android 拍照以及相册中选择(适配高版本)————上传头像并裁剪(一)

前言 在项目研发中&#xff0c;相信大家都遇到过给用户增加头像照片的需求。 随着手机版本的不断更新&#xff0c;android 8、android 9、android 10、android 12、android 13、鸿蒙系统等等&#xff1b;遇到这个功能需求&#xff0c;大家肯定会想&#xff0c;“这还不好写&…

【Python学习】Python学习17- File(文件) 方法

目录 [TOC](【Python学习】Python学习17- File(文件) 方法) 文章所属专区 Python学习 前言 本章节主要说明Python文件操作的具体说明 open()方法 Python open() 方法用于打开一个文件&#xff0c;并返回文件对象&#xff0c;在对文件进行处理过程都需要使用到这个函数&#…

Spark算子(RDD)超细致讲解

SPARK算子&#xff08;RDD&#xff09;超细致讲解 map,flatmap,sortBykey, reduceBykey,groupBykey,Mapvalues,filter,distinct,sortBy,groupBy共10个转换算子 &#xff08;一&#xff09;转换算子 1、map from pyspark import SparkContext# 创建SparkContext对象 sc Spark…

信息系统中的需求分析

软件需求是指用户对新系统在功能、行为、性能、设计约束等方面的期望。根据IEEE的软件工程标准词汇表&#xff0c;软件需求是指用户解决问题或达到目标所需的条件或能力&#xff0c;是系统或系统部件要满足合同、标准、规范或其他正式规定文档所需具有的条件或能力&#xff0c;…

Fastjson库将JSONObject转换为实体类

嗨&#xff0c;大家好&#xff0c;欢迎来到程序猿漠然公众号&#xff0c;我是漠然。 在Java编程中&#xff0c;使用Fastjson库将JSONObject转换为实体类的过程是一种常见的数据处理操作。Fastjson是一个由阿里巴巴开发的高性能JSON处理库&#xff0c;它简化了JSON数据的读写操作…

传感数据分析——傅里叶滤波:理论与公式

传感数据分析——傅里叶滤波&#xff1a;理论与公式 引言 在传感数据分析领域&#xff0c;傅里叶滤波是一种重要的信号处理技术&#xff0c;被广泛应用于各种领域&#xff0c;如通信、图像处理、音频处理以及生物医学等。本文将简单探讨傅里叶滤波的理论基础和相关公式&#…

Azure Machine Learning - 视频AI技术

Azure AI 视频索引器是构建在 Azure 媒体服务和 Azure AI 服务&#xff08;如人脸检测、翻译器、Azure AI 视觉和语音&#xff09;基础之上的一个云应用程序&#xff0c;是 Azure AI 服务的一部分。 有了 Azure 视频索引器&#xff0c;就可以使用 Azure AI 视频索引器视频和音频…

向伟人学习反焦虑,在逆境中崛起

第一、乐观的精神。 伟人在长期以来的读书、思考和实践&#xff0c;突破了思想认知限制&#xff0c;并最终在更高的思维层面上&#xff0c;建立起了强大的精神信念感。 在危险环境中表示绝望的人&#xff0c; 在黑暗中看不见光明的人&#xff0c; 只是懦夫与机会主义者。 —— …

蓝桥杯练习题(八)

&#x1f4d1;前言 本文主要是【算法】——蓝桥杯练习题&#xff08;八&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …

[晓理紫]每日论文推送(有中文摘要,源码或项目地址)--机器人、视觉相关

专属领域论文订阅 VX关注{晓理紫}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 二维码 分类: 大语言模型LLM视觉模型VLM扩散模型视觉导航具身智能&#xff0c;机器人强化学习开放词汇&#xff0c;检测分割 晓理紫今日论…

二叉树的中序遍历【二叉树】【递归】

Problem: 94. 二叉树的中序遍历 文章目录 思路 & 解题方法复杂度Code 思路 & 解题方法 二叉树简单递归。 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code # Definition for a binary tree node. # class TreeNode: # def __init__(se…