当前位置: 首页 > 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…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...