「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. 基本操作
- 包含头文件:使用
vector
之前需要包含头文件<vector>
。
#include <vector>
- 创建
vector
:
std::vector<int> vec; // 创建一个空的 int 类型的 vector
std::vector<int> vecWithValues = {1, 2, 3, 4, 5}; // 创建一个包含 5 个整数的 vector
- 添加元素:
vec.push_back(6); // 在 vec 的末尾添加一个元素 6
vec.insert(vec.begin(), 0); // 在 vec 的开始位置插入一个元素 0
- 访问元素:
int firstElement = vec[0]; // 访问第一个元素
int lastElement = vec.back(); // 访问最后一个元素
int secondElement = *(vec.begin() + 1); // 使用迭代器访问第二个元素
- 删除元素:
vec.pop_back(); // 删除 vec 的最后一个元素
vec.erase(vec.begin()); // 删除 vec 的第一个元素
// 删除特定位置的元素
vec.erase(vec.begin() + 2); // 删除索引为 2 的元素(注意,索引是从 0 开始的)
- 遍历
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
中添加或删除元素时,特别是通过insert
或erase
方法时,可能会使指向被修改区域的迭代器失效。因此,在迭代过程中修改vector
时需要特别小心。
vector
是 C++ 中一个非常强大且灵活的容器,几乎可以替代所有需要动态数组的场景。
二、应用场景
vector
容器在 C++ 中有着广泛的应用场景,主要得益于其动态数组的特性,能够方便地存储和操作任意数量的同类型元素。以下是一些 vector
容器的应用场景及详细案例:
1. 应用场景
- 存储动态大小的数据集合:
- 当需要存储的数据量在程序运行时可能发生变化时,
vector
是一个很好的选择。它可以动态地增加或减少大小,以适应不同的数据需求。
- 代替数组:
- 在许多情况下,
vector
可以作为数组的替代品,提供更多的功能和便利的操作。例如,vector
支持动态扩容,而数组的大小在定义后就不能改变。
- 实现栈和队列:
- 可以使用
vector
来实现栈和队列等数据结构。通过push_back()
方法可以在vector
的末尾添加元素,模拟栈的压栈操作;通过pop_back()
方法可以删除vector
的最后一个元素,模拟栈的弹栈操作。对于队列,可以使用insert()
和erase()
方法在vector
的前端进行插入和删除操作,但通常使用deque
(双端队列)更为合适,因为它在两端都支持快速插入和删除。
- 实现动态数组:
- 由于
vector
的大小可以动态调整,因此它非常适合用来实现动态数组。这在需要频繁增减元素的情况下尤为有用。
- 存储容器元素:
vector
可以作为其他容器的元素,实现复杂的数据结构。例如,可以创建一个vector<vector<int>>
来表示二维数组或矩阵。
- 作为函数参数:
- 可以将
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;
}
三、相关链接
- Visual Studio Code下载地址
- Sublime Text下载地址
- 「C++系列」C++简介、应用领域
- 「C++系列」C++ 基本语法
- 「C++系列」C++ 数据类型
- 「C++系列」C++ 变量类型
- 「C++系列」C++ 变量作用域
- 「C++系列」C++ 常量知识点-细致讲解
- 「C++系列」C++ 修饰符类型
- 「C++系列」一篇文章说透【存储类】
- 「C++系列」一篇文章讲透【运算符】
- 「C++系列」循环
- 「C++系列」判断
- 「C++系列」函数/内置函数
- 「C++系列」数字/随机数
- 「C++系列」数组
- 「C++系列」字符串
- 「C++系列」指针
- 「C++系列」引用
- 「C++系列」日期/时间
- 「C++系列」输入/输出
- 「C++系列」数据结构
相关文章:

「C++系列」vector 容器
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能教程 文章目录 一、vector 容器1. 基本特性2. 基本操作3. 注意事项 二、应用场景1. 应用场景2. 案例案例一࿱…...
梯度的概念
梯度 机器学习中,梯度下降法,牛顿法都会用到梯度概念 对于一元函数,梯度可以看成导数 对于多元函数,梯度可以看成偏导数 如果多元函数包含N个自变量: x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,x…...
低代码开发:机遇与挑战并存的技术革新
近年来,随着数字化转型的加速,低代码开发平台如雨后春笋般涌现,承诺让非专业人士也能快速构建应用程序。这种新兴技术正在挑战传统软件开发模式,引发了IT行业的广泛讨论。低代码平台是提高效率的利器,还是降低了编程门…...

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

【JAVA CORE_API】Day19 多线程API(2)、多线程并发安全问题、同步
多线程API 进程和线程 进程:进程就像是一个程序在电脑里运行时的一个实例。你可以把它想象成一个独立的小工人,专门负责完成某项任务(比如打开浏览器、播放音乐)。每个进程都有自己独立的资源(比如内存)和…...

最新Windows 11 23H2精简版,免费获取!稳定流畅!
今日,系统之家小编给大家带来了2024最新的Windows11 23H2精简版系统,该版本系统经过适度地优化与精简,保留大部分功能,完全能满足日常使用需求,兼容性非常出色,无需担心应用程序出现闪退问题。大家可以通过…...
PostgreSQL SELECT 语句:深入解析与实例应用
PostgreSQL SELECT 语句:深入解析与实例应用 PostgreSQL 是一款功能强大的开源关系数据库管理系统,它以稳定性、可靠性以及支持高级功能而著称。在 PostgreSQL 中,SELECT 语句是最基本也是最重要的查询语句之一,用于从数据库表中检索数据。本文将详细介绍 SELECT 语句的用…...

【自然语言处理】 构建文本对话系统
构建文本对话系统的框架如下: 根据聊天系统目的功用的不同,可分成三大类型: 闲聊式机器人:较有代表性的有微软小冰、微软小娜、苹果的 Siri、小 i 机器人等,主要以娱乐为目的。 **知识问答型机器人:**知识…...
java: 程序包org.slf4j不存在
当在Java项目中遇到“程序包org.slf4j不存在”的错误时,这通常意味着你的项目没有正确地包含SLF4J(Simple Logging Facade for Java)的库。SLF4J是一个Java的日志门面(Facade),它允许你在后端使用不同的日志…...

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

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

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

如何理解递归
在二叉树的题目中,我们难免会用到递归方法,递归思想很简单,但运用起来却因为抽象而难以理解。 理解递归的关键在于认识到它是一种解决问题的方法,允许函数直接或间接地调用自身。以下是对递归的概述以及如何理解它的几个要点&…...
Spring Cache sync属性
在Spring Cache中,Cacheable注解用于标记一个方法,使其返回值可以被缓存。sync属性是Spring 4.3引入的一个新特性,用于控制缓存的同步行为。 sync 属性 sync属性的默认值是false,表示异步缓存。如果将sync设置为true,…...

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

[Spring] Spring原理(SpringBoot完结)
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
python | rq,一个无敌的 关于Redis 的Python 库!
本文来源公众号“python”,仅用于学术分享,侵权删,干货满满。 原文链接:rq,一个无敌的 Python 库! 大家好,今天为大家分享一个无敌的 Python 库 - rq。 Github地址:https://githu…...

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

【C++】深度解析:用 C++ 模拟实现 priority_queue类,探索其底层实现细节(仿函数、容器适配器)
目录 ⭐前言 ✨堆 ✨容器适配器 ✨仿函数 ⭐priority_queue介绍 ⭐priority_queue参数介绍 ⭐priority_queue使用 ⭐priority_queue实现 ✨仿函数实现 ✨堆的向上调整和向下调整 ✨完整代码 ⭐前言 ✨堆 堆是一种特殊的树形数据结构,通常以二叉树的…...

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

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
python读取SQLite表个并生成pdf文件
代码用于创建含50列的SQLite数据库并插入500行随机浮点数据,随后读取数据,通过ReportLab生成横向PDF表格,包含格式化(两位小数)及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...