深入理解 C++ 中的 std::vector

在 C++ 标准库中,std::vector 是一个动态数组类。相较于静态数组,std::vector 能够根据需求自动扩展或缩小,非常适合在算法竞赛中使用。在蓝桥杯比赛中,std::vector 常用于存储动态数据、处理数组扩展问题,甚至可以代替二维数组以简化代码。

目录

  • 1. std::vector 的基础概念
  • 2. 创建 std::vector
  • 3. 动态扩展和容量管理
    • 3.1 动态扩展
    • 3.2 手动管理容量
  • 4. 常用操作和方法
    • 4.1添加和删除元素
    • 4.2 访问元素
    • 4.3 迭代器遍历
  • 5. std::vector 在竞赛中的应用场景
    • 5.1 动态数据存储
    • 5.2 模拟栈结构
    • 5.3 模拟二维数组
  • 6.注意事项

1. std::vector 的基础概念

std::vector 是一种动态数组容器,可以根据需要动态调整大小。其底层实现是连续的内存块,能够支持随机访问(即通过索引访问元素)。与普通数组相比,它不仅支持增删操作,还能自动扩展容量,从而更灵活。
std::vector 的内部机制
std::vector 的动态扩展机制基于 容量(capacity) 的概念。vector 会在内部维护一个预分配的内存块以存储元素。当容量不足时,vector 会自动扩展为原来的 1.5 倍或 2 倍,从而减少频繁分配内存的开销。

2. 创建 std::vector

在创建 std::vector 时,可以通过不同的方式初始化它:

3. 动态扩展和容量管理

3.1 动态扩展

当使用 push_back() 向 vector 中添加元素时,如果容量不够,vector 会自动分配更多的内存,重新拷贝现有元素,从而扩展容量。

std::vector<int> vec;
for (int i = 0; i < 10; i++) {vec.push_back(i);std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;
}

3.2 手动管理容量

如果预先知道 vector 大小,可以使用 reserve() 函数来分配内存,从而避免多次扩展的性能开销:

std::vector<int> vec;
vec.reserve(10); // 预分配容量为10
for (int i = 0; i < 10; i++) {vec.push_back(i);
}

4. 常用操作和方法

4.1添加和删除元素

  • push_back(): 在末尾添加元素
  • pop_back(): 删除末尾元素
  • insert(): 在指定位置插入元素
  • erase(): 删除指定位置的元素
  • clear(): 清空所有元素
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.push_back(6); // {1, 2, 3, 4, 5, 6}
vec.pop_back();   // {1, 2, 3, 4, 5}
vec.insert(vec.begin() + 2, 10); // {1, 2, 10, 3, 4, 5}
vec.erase(vec.begin() + 2); // {1, 2, 3, 4, 5}
vec.clear(); // 清空所有元素,size 为 0

4.2 访问元素

  • 随机访问:可以使用索引访问 vector 中的元素。
  • 边界检查:使用 at() 方法可以提供越界检查,防止非法访问。
std::vector<int> vec = {1, 2, 3, 4, 5};
std::cout << vec[0] << std::endl;   // 输出: 1
std::cout << vec.at(1) << std::endl; // 输出: 2,带边界检查

4.3 迭代器遍历

可以使用迭代器来遍历 vector。使用 begin() 和 end() 可以获取 vector 的首尾位置。

std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";
}
std::cout << std::endl;

5. std::vector 在竞赛中的应用场景

5.1 动态数据存储

在算法竞赛中,我们常常需要存储未知数量的数据。例如,读取输入数据时,std::vector 可以轻松地进行动态扩展:

int n;
std::cin >> n;
std::vector<int> data;for (int i = 0; i < n; i++) {int x;std::cin >> x;data.push_back(x);
}// 输出所有数据
for (int x : data) {std::cout << x << " ";
}

5.2 模拟栈结构

std::vector 提供的 push_back() 和 pop_back() 操作,与栈的数据结构操作类似,因此可以用 vector 模拟栈来解决括号匹配等问题。

std::string s = "((()))";
std::vector<char> stack;for (char c : s) {if (c == '(') {stack.push_back(c);} else if (!stack.empty() && stack.back() == '(') {stack.pop_back();}
}if (stack.empty()) {std::cout << "匹配成功!" << std::endl;
} else {std::cout << "匹配失败!" << std::endl;
}

5.3 模拟二维数组

在图的算法中,可以用 std::vector<std::vector> 来表示邻接矩阵。以下是一个示例:

int n = 5; // 顶点个数
std::vector<std::vector<int>> graph(n, std::vector<int>(n, 0));// 添加边
graph[0][1] = 1;
graph[1][2] = 1;
graph[2][3] = 1;
graph[3][4] = 1;// 输出邻接矩阵
for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {std::cout << graph[i][j] << " ";}std::cout << std::endl;
}

6.注意事项

  • 性能优化:频繁的动态扩展可能会导致性能下降。可以在已知大小的情况下提前 reserve() 容量。
  • 边界检查:at() 提供了安全访问,但如果对性能要求高,可以直接使用 [] 操作符。
  • 二维 vector:在图的算法中,尽量选择合适的数据结构以提高代码效率。

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

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

相关文章

自己开发得期货资管模拟软件演示1.0.15版仅供学习

期货资管模拟软件演示1.0.15版仅供学习——C技术栈知识分享 本文将以期货资管模拟软件演示1.0.15版为例&#xff0c;分享其基于C技术栈的框架知识。 一、C技术栈在期货交易软件开发中的应用 C作为一种高性能的编程语言&#xff0c;以其强大的内存管理能力和高效的执行速度&a…

详解:字符串常量池

字符串常量池是Java运行时环境&#xff08;JRE&#xff09;的一部分&#xff0c;它用于存储字符串字面量。字符串字面量是源代码中直接用双引号括起来的字符串&#xff0c;例如"hello"。在Java中&#xff0c;字符串是不可变的&#xff0c;这意味着一旦创建了一个字符…

三次样条插值算法及推导过程

目录 1、定义 2、已知条件求解 3、具体推导 4、matlab案例 5、案例结果 6、matlab仿真 1、定义 给定 n 1 n1 n1个数据点&#xff0c;共有 n n n个区间&#xff0c;三次样条方程 S ( n ) S(n) S(n)满足以下条件&#xff1a;在每个分段区间内 ( x i , x i 1 ) (x_i,x_{i1}) (…

[数据结构从小白到大牛]第五篇:3分钟带你吃透双链表并用C语言模拟实现

目录 1->前言 2->链表的概念和结构 2.1链表概念 2.2->带头双向循环链表结构 3->模拟实现带头双向循环链表 3.1定义链表结点 struct ListNode 3.2创建链表结点 CreateLTNode 函数 3.3链表初始化函数 ListInit函数 3.4链表打印函数 ListPrint函数 3.5链表…

Rancher的安装

1. 概览 1.1 用户界面优势 Rancher 提供了一个直观的图形用户界面&#xff08;GUI&#xff09;。对于不熟悉 Kubernetes 复杂的命令行操作&#xff08;如使用kubectl&#xff09;的用户来说&#xff0c;通过 Rancher 的界面可以方便地进行资源管理。例如&#xff0c;用户可以在…

【办公类-04-04】华为助手导出照片视频分类(根据图片、视频的文件名日期导入“年-月-日”文件夹中,并转移到“年-月”文件中整理、转移到“年”文件夹中整理)

背景需求 最近带班&#xff0c;没有时间整理照片&#xff0c;偶尔导一次&#xff0c;几个月的照片。发现用电脑版“华为手机助手“中的WLAN连接”与华为手机的“华为手机助手”连接&#xff0c;速度更快、更稳定&#xff0c;不会出现数据线连接时碰碰就断网的问题 1、先打开电…

CDGP|企业数据治理流程全解析

在当今信息化时代&#xff0c;数据已成为企业最重要的资产之一。为了充分发挥数据的价值&#xff0c;企业需要对数据进行全面、系统的治理。企业数据治理流程是一套确保数据质量、安全性和合规性的规范化流程&#xff0c;涵盖了从数据采集到销毁的全过程。本文将详细介绍一般企…

学习threejs,将多个网格合并成一个网格

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Geometry 几何体1.2 …

Linux 线程控制

一. 线程互斥 1.1 线程互斥相关概念 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源。临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区。互斥&#xff1a;任何时刻&#xff0c;互斥保证有且只有一个执行流进入临界区&…

Centos安装ZooKeeper教程(单机版)

本章教程介绍,如何在Centos7中,安装ZooKeeper 3.9.3版本。 一、什么是ZooKeeper ? Apache ZooKeeper 是一个分布式协调服务,用于大型分布式系统中的管理和协调。它为分布式应用提供了一个高性能的通信框架,简化了开发人员在构建复杂分布式系统的任务。ZooKeeper 能够解决一…

企业CRM管理系统PHP源码/PHP客户关系CRM客户管理系统源码

系统功能实现 1、 公海管理:公海类型、客户公海。 2、 线索管理:我的线索、线索列表、线索状态、线索来源。 3、 客户管理:我的客户、客户列表、成交客户、行业类别、预查、地区列表、客户状态、客户级别。 4、 业绩订单:订单列表、我的订单。 5、 系统设置:系统设置…

设置JAVA以适配华为2288HV2服务器的KVM控制台

华为2288HV2服务器比较老旧了&#xff0c;其管理控制台登录java配置比较麻烦&#xff0c;华为的ibmc_kvm_client_windows客户端测试了几个版本&#xff0c;连接控制台也有问题&#xff0c;最终安装JDK解决。 一、测试环境 主机为WindowsServer2012R2,64位系统 二、Java软件包…

10大软件使用感受分享,数据恢复的得力助手!!

在找数据恢复软件&#xff1f;&#xff01;是不是存在误删重要文件或遭遇硬盘故障&#xff0c;想要找回丢失的数据&#xff1f;别担心&#xff0c;今天我就来给大家分享10款我亲自使用过的数据恢复软件&#xff0c;分别给你说说它们各自的优缺点&#xff0c;希望能帮你们在数据…

一周模电速成(3) 超详细!入门小白速成!!!

目录 稳压二极管 整流二极管 晶体三极管 三极管结构图 三极管的特点 1、如何让它工作在放大状态呢 2、如何工作在截止状态呢&#xff1f; 3、如何让三极管工作在饱和状态呢&#xff1f; 在电路中要如何实现呢&#xff1f;工作在各个状态有什么特点呢&#xff1f; 截止…

Python的条件语句if与match...case

一、定义 条件语句&#xff0c;也叫作选择语句、判断语句。根绝特定条件判断是否成立&#xff0c;执行不同的语句段。简单来说&#xff0c;满足条件执行&#xff0c;不满足不执行。 条件语句是使用关键字 if 做判断&#xff0c;根据不同情况结合不同的关键字else 或者 elif来…

SpringBoot基础系列学习(二):日志

文章目录 一丶日志控制台介绍二丶日志的用法三丶日志级别四丶配置文件参数及介绍五丶slf4j 一丶日志控制台介绍 只要引用了spring-boot-starter依赖,就无需引入日志依赖,里面自带了logging依赖,默认情况下,springBoot使用Logback来记录日志,并用INFO级别输出到控制台 二丶日…

Bert模型介绍

简介 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一个基于Transformer的双向编码器表示模型&#xff0c;它通过预训练学习到了丰富的语言表示&#xff0c;并可以用于各种自然语言处理任务。 模型结构&#xff1a;BERT基于Transf…

AI驱动无人驾驶:安全与效率能否兼得?

内容概要 如今&#xff0c;人工智能正以其神奇的魔力驱动着无人驾驶的浪潮&#xff0c;带来了无数令人兴奋的可能性。这一领域的最新动态显示&#xff0c;AI技术在车辆的决策过程和实时数据分析中发挥着重要作用&#xff0c;帮助车辆更聪明地应对复杂的交通环境。通过实时监测…

Windows、Linux系统上进行CPU和内存压力测试

CPU和内存压力测试 1. Linux环境 Linux环境下&#xff0c;我们可以用 stress 工具进行内存、CPU等的压力测试。 【1】. stress工具说明 [kalamikysrv1 ~]$ stress --help stress imposes certain types of compute stress on your systemUsage: stress [OPTION [ARG]] ...-…