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…

vue3如何创建多环境变量

首先在全局目录中新建.env.development文件和.env.production文件、.env.test文件 .env.development文件 VITE_MODE_NAMEdevelopment VITE_API_URL"http://xxxxxxxxxx" 注意&#xff1a;必须要以VITE_ 去开头&#xff0c;否则获取不到 依次去配置.env.production文…

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;以及在文本提…

C++ Windwos 文件操作

两种方式获取文件大小 INT64 MyGetFileSize(const CString& strFilePath) {//获取文件大小INT64 nLen 0;WIN32_FILE_ATTRIBUTE_DATA attr { 0 }; //文件属性结构体if (FALSE GetFileAttributesEx(strFilePath, GetFileExInfoStandard, &attr)) //获取文…

图论篇--代码随想录算法训练营第五十一天打卡| 99. 岛屿数量(深搜版),99. 岛屿数量(广搜版),100. 岛屿的最大面积

99. 岛屿数量&#xff08;深搜版&#xff09; 题目链接&#xff1a;99. 岛屿数量 题目描述&#xff1a; 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而…

FFmpeg源码:compute_frame_duration函数分析

一、compute_frame_duration函数的定义 compute_frame_duration函数定义在FFmpeg源码&#xff08;本文演示用的FFmpeg源码版本为7.0.1&#xff09;的源文件libavformat/demux.c中&#xff1a; /*** Return the frame duration in seconds. Return 0 if not available.*/ stat…

2025秋招NLP算法面试真题(十八)-大模型训练数据格式常见问题

目录: SFT(有监督微调)的数据集格式RM(奖励模型)的数据格式PPO(强化学习)的数据格式找数据集哪里找微调需要多少条数据有哪些大模型的训练集进行领域大模型预训练应用哪些数据集比较好1.SFT(有监督微调)的数据集格式? 对于大语言模型的训练中,SFT(Supervised Fine…

pycharm如何安装selenium

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

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中…

SQL 编程基础

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

Android 调试桥——ADB

文章目录 前言ADB 的主要功能设备连接与管理应用安装与卸载文件传输日志查看设备重启 常用命令连接方式有线无线注意点 前言 ADB&#xff08;Android Debug Bridge&#xff0c;安卓调试桥&#xff09;是 Android SDK 提供的一种命令行工具&#xff0c;用于在开发者的计算机和 …

Stable Diffusion训练LoRA模型参数详细说明(阿里巴巴堆友AI)

工具&#xff1a;线上模型训练堆友AI 一、训练参数 批量大小 (Batch Size) 作用&#xff1a;每次训练中使用的样本数量。参考值&#xff1a;可以从 8 到 64&#xff0c;取决于显存大小。 训练轮数 (Epochs) 作用&#xff1a;完整遍历训练数据的次数。参考值&#xff1a;通…

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

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

C# 使用阿里DOH

阿里公共DNS 1. DNS over HTTPs(DoH) 阿里公共DNS通过RFC 8484指定的经过TLS加密的HTTP连接提供DNS解析 DNS over HTTPs&#xff08;DoH&#xff09;的URI接口 &#xff1a;&#xff08;仅提供TLS API&#xff09; https://dns.alidns.com/dns-query?https://alidns_ip/dn…

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在项目…