「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…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
