当前位置: 首页 > news >正文

「C++系列」vector 容器

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能教程

文章目录

  • 一、vector 容器
    • 1. 基本特性
    • 2. 基本操作
    • 3. 注意事项
  • 二、应用场景
    • 1. 应用场景
    • 2. 案例
      • 案例一:存储动态大小的数据集合
      • 案例二:实现栈
  • 三、相关链接

一、vector 容器

C++ 中的 vector 是一个非常常用的容器(container),它属于 STL(Standard Template Library,标准模板库)的一部分。vector 是一个能够存储具有相同类型元素的动态数组,这意味着它可以在运行时动态地增加或减少大小。与普通的数组不同,vector 会自动管理其存储空间,并在需要时重新分配内存以容纳更多的元素。

1. 基本特性

  • 动态数组vector 的大小可以在运行时改变,即可以动态地添加或删除元素。
  • 连续内存vector 中的元素存储在连续的内存位置中,这意味着可以像普通数组一样通过索引快速访问任何元素(即使用 operator[])。
  • 自动内存管理vector 自动管理其存储空间的分配和释放,无需用户手动处理。
  • 随机访问迭代器:由于 vector 的元素存储在连续的内存中,它支持随机访问迭代器,这意味着可以直接通过索引访问任何元素。

2. 基本操作

  1. 包含头文件:使用 vector 之前需要包含头文件 <vector>
#include <vector>
  1. 创建 vector
std::vector<int> vec; // 创建一个空的 int 类型的 vector
std::vector<int> vecWithValues = {1, 2, 3, 4, 5}; // 创建一个包含 5 个整数的 vector
  1. 添加元素
vec.push_back(6); // 在 vec 的末尾添加一个元素 6
vec.insert(vec.begin(), 0); // 在 vec 的开始位置插入一个元素 0
  1. 访问元素
int firstElement = vec[0]; // 访问第一个元素
int lastElement = vec.back(); // 访问最后一个元素
int secondElement = *(vec.begin() + 1); // 使用迭代器访问第二个元素
  1. 删除元素
vec.pop_back(); // 删除 vec 的最后一个元素
vec.erase(vec.begin()); // 删除 vec 的第一个元素
// 删除特定位置的元素
vec.erase(vec.begin() + 2); // 删除索引为 2 的元素(注意,索引是从 0 开始的)
  1. 遍历 vector
for (int i = 0; i < vec.size(); ++i) {std::cout << vec[i] << " ";
}
std::cout << std::endl;// 使用迭代器
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";
}
std::cout << std::endl;// 使用 C++11 的范围 for 循环
for (int value : vec) {std::cout << value << " ";
}
std::cout << std::endl;

3. 注意事项

  • 内存分配:当 vector 的大小增加时,它可能需要重新分配内存以存储更多的元素。这通常涉及复制或移动所有现有元素到新分配的内存中,这可能会是一个耗时的操作。
  • 迭代器失效:在 vector 中添加或删除元素时,特别是通过 inserterase 方法时,可能会使指向被修改区域的迭代器失效。因此,在迭代过程中修改 vector 时需要特别小心。

vector 是 C++ 中一个非常强大且灵活的容器,几乎可以替代所有需要动态数组的场景。

二、应用场景

vector 容器在 C++ 中有着广泛的应用场景,主要得益于其动态数组的特性,能够方便地存储和操作任意数量的同类型元素。以下是一些 vector 容器的应用场景及详细案例:

1. 应用场景

  1. 存储动态大小的数据集合
  • 当需要存储的数据量在程序运行时可能发生变化时,vector 是一个很好的选择。它可以动态地增加或减少大小,以适应不同的数据需求。
  1. 代替数组
  • 在许多情况下,vector 可以作为数组的替代品,提供更多的功能和便利的操作。例如,vector 支持动态扩容,而数组的大小在定义后就不能改变。
  1. 实现栈和队列
  • 可以使用 vector 来实现栈和队列等数据结构。通过 push_back() 方法可以在 vector 的末尾添加元素,模拟栈的压栈操作;通过 pop_back() 方法可以删除 vector 的最后一个元素,模拟栈的弹栈操作。对于队列,可以使用 insert()erase() 方法在 vector 的前端进行插入和删除操作,但通常使用 deque(双端队列)更为合适,因为它在两端都支持快速插入和删除。
  1. 实现动态数组
  • 由于 vector 的大小可以动态调整,因此它非常适合用来实现动态数组。这在需要频繁增减元素的情况下尤为有用。
  1. 存储容器元素
  • vector 可以作为其他容器的元素,实现复杂的数据结构。例如,可以创建一个 vector<vector<int>> 来表示二维数组或矩阵。
  1. 作为函数参数
  • 可以将 vector 作为函数的参数传递,方便进行数据的传递和处理。由于 vector 支持复制构造函数和赋值操作,因此可以很容易地在函数之间传递 vector 对象。

2. 案例

案例一:存储动态大小的数据集合

假设我们需要存储一个班级中所有学生的分数,但事先不知道学生的具体数量。这时,可以使用 vector 来存储这些分数。

#include <iostream>
#include <vector>int main() {std::vector<int> scores;// 假设我们不知道学生的具体数量,但可以动态地添加分数scores.push_back(90);scores.push_back(85);scores.push_back(95);// 遍历并打印分数for (int score : scores) {std::cout << score << " ";}std::cout << std::endl;return 0;
}

案例二:实现栈

使用 vector 实现一个简单的栈结构,支持压栈和弹栈操作。

#include <iostream>
#include <vector>class Stack {
private:std::vector<int> data;public:void push(int value) {data.push_back(value);}int pop() {if (!data.empty()) {int top = data.back();data.pop_back();return top;}throw std::out_of_range("Stack is empty!");}bool isEmpty() const {return data.empty();}
};int main() {Stack s;s.push(1);s.push(2);s.push(3);while (!s.isEmpty()) {std::cout << s.pop() << " ";}std::cout << std::endl;return 0;
}

在这里插入图片描述

三、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C++系列」C++简介、应用领域
  4. 「C++系列」C++ 基本语法
  5. 「C++系列」C++ 数据类型
  6. 「C++系列」C++ 变量类型
  7. 「C++系列」C++ 变量作用域
  8. 「C++系列」C++ 常量知识点-细致讲解
  9. 「C++系列」C++ 修饰符类型
  10. 「C++系列」一篇文章说透【存储类】
  11. 「C++系列」一篇文章讲透【运算符】
  12. 「C++系列」循环
  13. 「C++系列」判断
  14. 「C++系列」函数/内置函数
  15. 「C++系列」数字/随机数
  16. 「C++系列」数组
  17. 「C++系列」字符串
  18. 「C++系列」指针
  19. 「C++系列」引用
  20. 「C++系列」日期/时间
  21. 「C++系列」输入/输出
  22. 「C++系列」数据结构

相关文章:

「C++系列」vector 容器

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff1a;人工智能教程 文章目录 一、vector 容器1. 基本特性2. 基本操作3. 注意事项 二、应用场景1. 应用场景2. 案例案例一&#xff1…...

梯度的概念

梯度 机器学习中&#xff0c;梯度下降法&#xff0c;牛顿法都会用到梯度概念 对于一元函数&#xff0c;梯度可以看成导数 对于多元函数&#xff0c;梯度可以看成偏导数 如果多元函数包含N个自变量&#xff1a; x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1​,x2​,...,x…...

低代码开发:机遇与挑战并存的技术革新

近年来&#xff0c;随着数字化转型的加速&#xff0c;低代码开发平台如雨后春笋般涌现&#xff0c;承诺让非专业人士也能快速构建应用程序。这种新兴技术正在挑战传统软件开发模式&#xff0c;引发了IT行业的广泛讨论。低代码平台是提高效率的利器&#xff0c;还是降低了编程门…...

Linux之RabbitMQ集群部署

RabbitMQ 消息中间件 1、消息中间件 消息(message)&#xff1a; 指在服务之间传送的数据。可以是简单的文本消息&#xff0c;也可以是包含复杂的嵌入对象的消息 消息队列(message queue): 指用来存放消息的队列&#xff0c;一般采用先进先出的队列方式&#xff0c;即最先进入的…...

【JAVA CORE_API】Day19 多线程API(2)、多线程并发安全问题、同步

多线程API 进程和线程 进程&#xff1a;进程就像是一个程序在电脑里运行时的一个实例。你可以把它想象成一个独立的小工人&#xff0c;专门负责完成某项任务&#xff08;比如打开浏览器、播放音乐&#xff09;。每个进程都有自己独立的资源&#xff08;比如内存&#xff09;和…...

最新Windows 11 23H2精简版,免费获取!稳定流畅!

今日&#xff0c;系统之家小编给大家带来了2024最新的Windows11 23H2精简版系统&#xff0c;该版本系统经过适度地优化与精简&#xff0c;保留大部分功能&#xff0c;完全能满足日常使用需求&#xff0c;兼容性非常出色&#xff0c;无需担心应用程序出现闪退问题。大家可以通过…...

PostgreSQL SELECT 语句:深入解析与实例应用

PostgreSQL SELECT 语句:深入解析与实例应用 PostgreSQL 是一款功能强大的开源关系数据库管理系统,它以稳定性、可靠性以及支持高级功能而著称。在 PostgreSQL 中,SELECT 语句是最基本也是最重要的查询语句之一,用于从数据库表中检索数据。本文将详细介绍 SELECT 语句的用…...

【自然语言处理】 构建文本对话系统

构建文本对话系统的框架如下&#xff1a; 根据聊天系统目的功用的不同&#xff0c;可分成三大类型&#xff1a; 闲聊式机器人&#xff1a;较有代表性的有微软小冰、微软小娜、苹果的 Siri、小 i 机器人等&#xff0c;主要以娱乐为目的。 **知识问答型机器人&#xff1a;**知识…...

java: 程序包org.slf4j不存在

当在Java项目中遇到“程序包org.slf4j不存在”的错误时&#xff0c;这通常意味着你的项目没有正确地包含SLF4J&#xff08;Simple Logging Facade for Java&#xff09;的库。SLF4J是一个Java的日志门面&#xff08;Facade&#xff09;&#xff0c;它允许你在后端使用不同的日志…...

图片转PDF怎么转?教你3种快捷方便的jpg转pdf方法

图片文件以及PDF文档已经是我们工作当中不可或缺的一部分&#xff0c;我们在一些商务合作的场景下经常需要把拍摄下来的合同、企划书、画册等图片内容转换为PDF格式后再发送&#xff0c;这样能够极大程度的保证文件的安全性&#xff0c;那么图片应该如何转换成PDF文件呢?今天来…...

数据防泄密软件如何防止数据泄密?七大措施筑起数据安全壁垒

数据防泄密软件通过集成多种安全防护技术&#xff0c;旨在全面保护企业数据的安全性和保密性。以安企神软件为例&#xff0c;其实现全面防泄密的方式主要包括以下7个方面&#xff0c;为企业筑起数据安全壁垒。 1. 透明加密技术 安企神软件采用先进的透明加密技术&#xff0c;确…...

GNU/Linux - systemd介绍

systemd官网&#xff1a; System and Service Manager systemd systemd Github地址&#xff1a; https://github.com/systemd/systemd 首次发布 2010年3月30日 System and Service Manager systemd 是一套 Linux 系统的基本构件。它提供了一个系统和服务管理器&#xff0c;作为…...

如何理解递归

在二叉树的题目中&#xff0c;我们难免会用到递归方法&#xff0c;递归思想很简单&#xff0c;但运用起来却因为抽象而难以理解。 理解递归的关键在于认识到它是一种解决问题的方法&#xff0c;允许函数直接或间接地调用自身。以下是对递归的概述以及如何理解它的几个要点&…...

Spring Cache sync属性

在Spring Cache中&#xff0c;Cacheable注解用于标记一个方法&#xff0c;使其返回值可以被缓存。sync属性是Spring 4.3引入的一个新特性&#xff0c;用于控制缓存的同步行为。 sync 属性 sync属性的默认值是false&#xff0c;表示异步缓存。如果将sync设置为true&#xff0c…...

【Unity】通用GM QA工具 运行时数值修改 命令行 测试工具

GM工具使用: GM工具通常用于游戏运行时修改数值(加钱/血量)、解锁关卡等&#xff0c;用于快速无死角测试游戏。一个通用型GM工具对于游戏项目是非常实用且必要的&#xff0c;但通用不能向易用妥协&#xff0c;纯命令行GM门槛太高&#xff0c;对QA不友好。 这类运行时命令行工具…...

[Spring] Spring原理(SpringBoot完结)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

python | rq,一个无敌的 关于Redis 的Python 库!

本文来源公众号“python”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;rq&#xff0c;一个无敌的 Python 库&#xff01; 大家好&#xff0c;今天为大家分享一个无敌的 Python 库 - rq。 Github地址&#xff1a;https://githu…...

Redis的缓存淘汰策略

1. 查看Redis 最大的占用内存 打开redis配置文件, 设置maxmemory参数&#xff0c;maxmemory 是bytes字节类型, 注意转换 2. Redis默认内存多少可以用 注意: 在64bit系统下&#xff0c; maxmemory 设置为 0 表示不限制Redis内存使用 3. 一般生产上如何配置 一般推荐Redis 设置内…...

【C++】深度解析:用 C++ 模拟实现 priority_queue类,探索其底层实现细节(仿函数、容器适配器)

目录 ⭐前言 ✨堆 ✨容器适配器 ✨仿函数 ⭐priority_queue介绍 ⭐priority_queue参数介绍 ⭐priority_queue使用 ⭐priority_queue实现 ✨仿函数实现 ✨堆的向上调整和向下调整 ✨完整代码 ⭐前言 ✨堆 堆是一种特殊的树形数据结构&#xff0c;通常以二叉树的…...

1个人躲,5个人抓!《极限竞速:地平线5》全新游戏模式“捉迷藏”即将推出

风靡全球的赛车竞速游戏《极限竞速&#xff1a;地平线5》即将推出全新游戏模式——捉迷藏(Hide & Seek)。 《极限竞速&#xff1a;地平线5》日前发布了全新预告&#xff0c;展示了即将于 9 月 10 日推出的捉迷藏模式游戏玩法。该预告是日前举办的2024 年科隆国际游戏展 Xb…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...