C++ 中的 vector 容器详解与应用示例

vector 是 C++ 标准模板库(STL)中最常用的顺序容器之一。与数组相比,vector 具有动态大小调整、内存自动管理等特点,极大地方便了日常编程工作。本文将从 vector 的基本用法、常用操作、具体示例等方面进行详细介绍。

1. vector 简介

vector 是一种动态数组,可以根据需要自动调整其大小。在添加或删除元素时,vector 会自动分配和释放内存。

常见的 vector 操作:
  • 自动扩展:当 vector 容量不足时,自动增加容量。
  • 随机访问:通过下标访问元素,时间复杂度为 O(1)。
  • 自动管理内存:当 vector 被销毁时,自动释放内存。

2. vector 的基本用法

#include <iostream>
#include <vector>int main() {// 定义一个存储 int 类型的 vectorstd::vector<int> vec;// 向 vector 中添加元素vec.push_back(10);vec.push_back(20);vec.push_back(30);// 输出 vector 的元素for (int i = 0; i < vec.size(); ++i) {std::cout << "vec[" << i << "] = " << vec[i] << std::endl;}// 获取 vector 的大小std::cout << "Vector size: " << vec.size() << std::endl;return 0;
}
vec[0] = 10
vec[1] = 20
vec[2] = 30
Vector size: 3

 在上面的代码中,push_back() 用于向 vector 的尾部添加元素,size() 用于获取当前元素的个数。

3. 常用操作

1. 初始化 vector

可以通过多种方式初始化 vector

// 空的 vector
std::vector<int> v1;// 使用默认值初始化
std::vector<int> v2(5);  // 创建包含 5 个元素的 vector,初始值为 0
std::vector<int> v3(5, 100);  // 创建 5 个元素,初始值为 100// 使用已有数组初始化
int arr[] = {1, 2, 3, 4, 5};
std::vector<int> v4(arr, arr + 5);  // 使用数组的指针初始化

2. 插入与删除操作

#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 在指定位置插入元素vec.insert(vec.begin() + 2, 10);  // 在第三个位置插入 10// 输出 vector 的所有元素for (int v : vec) {std::cout << v << " ";}std::cout << std::endl;// 删除第三个元素vec.erase(vec.begin() + 2);// 输出删除后的元素for (int v : vec) {std::cout << v << " ";}std::cout << std::endl;return 0;
}

 输出结果:

 

1 2 10 3 4 5 
1 2 3 4 5 

3. 清空与释放内存

std::vector<int> vec = {1, 2, 3};
vec.clear();  // 清空 vector,但容量不变
vec.shrink_to_fit();  // 释放未使用的内存

4. vector 的高级用法

1. 迭代器

vector 提供了随机访问迭代器,可以方便地遍历容器:

#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用迭代器遍历 vectorfor (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

2. 反向遍历

vector 允许反向遍历

for (auto it = vec.rbegin(); it != vec.rend(); ++it) {std::cout << *it << " ";
}

3. 动态调整容量

vector 自动管理内存,但我们可以手动控制容量:

std::vector<int> vec;
vec.reserve(100);  // 预分配内存,防止频繁重新分配

5. 常见问题与优化

  1. 频繁插入删除问题vector 的插入和删除操作在末尾效率较高,但在中间位置操作会导致大量元素的移动,建议在需要频繁插入或删除的情况下使用 std::liststd::deque

  2. 内存管理vector 在增长时会以倍数方式分配内存,减少内存分配的次数以提高效率。因此,如果已知大致的容量,可以提前使用 reserve() 进行预分配。

  3. 数据访问vector 支持随机访问,访问效率非常高。与 list 相比,vector 更适合频繁访问数据的场景。

6. 总结

vector 作为 C++ 中最常用的容器之一,提供了灵活、高效的动态数组操作。它不仅可以自动管理内存,还支持随机访问、动态调整大小等功能。在实际开发中,我们应根据不同的应用场景选择合适的 STL 容器,vector 适用于大多数需要动态数组的场景。

通过上述的代码示例,大家可以更好地理解 vector 的基本操作和高级用法。在未来的开发中,熟练使用 vector 将显著提高代码的可维护性和性能。

 

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

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

相关文章

部分库函数及其模拟

前言&#xff1a;当我们学习c/c库函数的时候&#xff0c;我们可以用网站 cplusplus.com - The C Resources Network 来进行查阅&#xff0c;学习。 目录 库函数&#xff1a; 1.字符串函数 1.1求字符串长度 strlen 1.2长度不受限制的字符串函数 1.2.1strcpy 1.2.2strca…

Pikachu靶场之RCE漏洞详解

一.exec "ping" 1.ping本机127.0.0.1 2.用&符拼接dir查看目录 3.&拼接echo输入一句话木马 127.0.0.1&echo "<?php eval($_POST[cmd]);?>)" > 6.php 4.同级目录访问6.php&#xff0c;蚁剑连接 二&#xff1a;exec "eval"…

c中 int 和 unsigned int

c语言中&#xff0c;char、short、int、int64以及unsigned char、unsigned short、unsigned int、unsigned int64等等类型都可以表示整数。但是他们表示整数的位数不同&#xff0c;比如&#xff1a;char/unisigned char表示8位整数&#xff1b; short/unsigned short表示16位整…

CATIA P3 V5-6R2020下载安装教程,附软件包百度网盘分享下载链接地址

CATIA V5软件介绍 CATIA V5 是达索系统公司开发的 CAD/CAE/CAM 一体化软件&#xff0c;在多行业广泛应用。它源于航空航天业&#xff0c;也是汽车工业事实标准。其发展历经多个版本&#xff0c;V5 版本界面友好且功能强大。 特点包括强大功能&#xff0c;如先进建模技术可创建…

Linux Vim的 命令大全

Linux Vim的 命令大全 文章目录 Linux Vim的 命令大全[TOC](文章目录)Vim 的历史Vi 的诞生Vim 的诞生Vim 的开源与发展Vim 的影响力1.Vim 的基本模式2. 正常模式常用命令3. 插入模式4. 命令模式5. 可视模式6. 其他有用的命令7. 自定义设置下载 Vim 的历史 Vim 的历史可以追溯到…

SD三分钟入门!秋叶大佬24年8月最新的Stable Diffusion整合包V4.9.7来了~

1 什么是 Stable Diffusion&#xff1f; Stable Diffusion&#xff08;简称SD&#xff09;是一种生成式人工智能技术&#xff0c;于2022年推出。它主要用于根据文本描述生成精细图像&#xff0c;同时也可应用于其他任务&#xff0c;如图像修补、扩展&#xff0c;以及在文本提…

pycharm如何安装selenium

在pycharm中打开一个项目后,点击Setting(ALTCtrlS快捷键) 然后点击install package完成后点击关闭这个窗口,就可以在代码中使用selenium了 成功后出现如下界面 编写一段正常可以运行操作chorme浏览器的 from selenium import webdriver # 指定ChromeDriver的路径driver we…

SQL 编程基础

SQL&#xff08;结构化查询语言&#xff09;广泛应用于数据库操作&#xff0c;是每个程序员都需要掌握的技能之一。这篇文章将带你从基础入门&#xff0c;了解SQL编程中的常量、变量及流程控制语句。我们将采用简单易懂的语言&#xff0c;结合实际示例&#xff0c;帮助你轻松理…

骨传导耳机推荐排名,精选五款热门好用不踩雷推荐

近两年来&#xff0c;骨传导运动蓝牙耳机在运动领域内日益流行。与传统耳机相比&#xff0c;它的显著优势是能够保持双耳开放&#xff0c;不会堵塞耳道&#xff0c;消除了入耳式耳机可能引起的不适感。此外还能避免运动时耳内出汗可能导致的各种卫生和健康问题。很多人就问了&a…

Python 调用手机摄像头

Python 调用手机摄像头 在手机上安装软件 这里以安卓手机作为演示&#xff0c;ISO也是差不多的 软件下载地址 注意&#xff1a;要想在电脑上查看手机摄像头拍摄的内容的在一个局域网里面(没有 WIFI 可以使用 热点 ) 安装完打开IP摄像头服务器 点击分享查看IP 查看局域网的I…

谷粒商城のNginx

文章目录 前言一、Nginx1、安装Nginx2、相关配置2.1、配置host2.2、配置Nginx2.3、配置网关 前言 本篇重点介绍项目中的Nginx配置。 一、Nginx 1、安装Nginx 首先需要在本地虚拟机执行&#xff1a; mkdir -p /mydata/nginx/html /mydata/nginx/logs /mydata/nginx/conf在项目…

数学建模笔记——TOPSIS[优劣解距离]法

数学建模笔记——TOPSIS[优劣解距离法] TOPSIS(优劣解距离)法1. 基本概念2. 模型原理3. 基本步骤4. 典型例题4.1 矩阵正向化4.2 正向矩阵标准化4.3 计算得分并归一化4.4 python代码实现 TOPSIS(优劣解距离)法 1. 基本概念 C. L.Hwang和 K.Yoon于1981年首次提出 TOPSIS(Techni…

Windows操作系统sid系统唯一标识符查看和修改

1、sid介绍 sid 作为windows系统唯一的标识&#xff0c;对某些集群业务有依赖关系&#xff0c;如果重复可能导致集群部署异常。 如&#xff1a;域控AD 就依赖 sid 功能。 但是某个云主机或虚拟机使用同一个ghost进行操作系统部署&#xff0c;就可能会导致重复的情况&#xf…

为什么现在都流行开放式耳机?平价高品质蓝牙耳机推荐大赏

现在开放式耳机流行&#xff0c;是因为相比入耳式&#xff0c;它具有以下的优势&#xff1a; 一、佩戴舒适 开放式耳机通常设计轻盈&#xff0c;不直接刺激耳膜&#xff0c;长时间使用也不会给耳膜带来压迫感。而且其不入耳的设计不会堵塞耳道&#xff0c;使用较长时间后&…

Notepad++ 修改 About

1. 用这个工具&#xff0c;看标题&#xff0c;修改 1700 里的 Caption, 保存为 xx.exe, 2.修改链接&#xff0c;先准备如上。 2.1 使用插件 Hex Editor&#xff0c;拖入刚保存的 Notepad.exe 到 Notepad.exe, 按 c..S..H 2.2 按 ctrlf 查找 68 00 74 00 74 00 70 00 73 00 3…

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中&#xff0c; "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时&#xff0c;经常听到第一范式&#xff08;1NF&#xff09;、第二范式&#xff08;2NF&#xff09;、第三范式&#xff08;3NF&#xff09;以及 BCNF&#xff08;Boyce-…

线程的四种操作

所属专栏&#xff1a;Java学习 1. 线程的开启 start和run的区别&#xff1a; run&#xff1a;描述了线程要执行的任务&#xff0c;也可以称为线程的入口 start&#xff1a;调用系统函数&#xff0c;真正的在系统内核中创建线程&#xff08;创建PCB&#xff0c;加入到链…

利士策分享,从零开始创业:一场勇敢而精彩的旅程

利士策分享&#xff0c;从零开始创业&#xff1a;一场勇敢而精彩的旅程 附上可落地执行的策略&#xff1a; 在创业的征途中&#xff0c;理论固然重要&#xff0c;但可落地执行的策略才是推动我们前进的实际动力。 以下是一些具体且可操作的策略&#xff0c;希望可以帮助你从零…

vue通过html2canvas+jspdf生成PDF问题全解(水印,分页,截断,多页,黑屏,空白,附源码)

前端导出PDF的方法不多&#xff0c;常见的就是利用canvas画布渲染&#xff0c;再结合jspdf导出PDF文件&#xff0c;代码也不复杂&#xff0c;网上的代码基本都可以拿来即用。 如果不是特别追求完美的情况下&#xff0c;或者导出PDF内容单页的话&#xff0c;那么基本上也就满足业…

《数字信号处理》学习05-单位冲击响应与系统响应

目录 一&#xff0c;单位冲激响应 二&#xff0c;LTI系统对任意序列的系统响应 三&#xff0c;LTI系统的性质 通过上一篇文章《数字信号处理》学习04-离散时间系统中的线性时不变系统-CSDN博客的学习&#xff0c;我已经知道了离散时间线性时不变系统&#xff08;LTI&#x…