C++ STL 中的 vector 总结

1. 什么是 std::vector

std::vector 是 C++ STL 提供的动态数组容器,可以动态调整大小并存储任意类型的元素。
与普通数组相比,std::vector 更加灵活,提供了丰富的操作接口。


2. 基本特性

  • 动态大小:支持在运行时动态增加或减少大小,自动管理内存。
  • 连续存储:元素在内存中是连续存储的,支持随机访问。
  • 时间复杂度
    • 随机访问:( O(1) )。
    • 插入/删除
      • 尾部操作:( O(1) )。
      • 中间或前部操作:( O(n) )(需要移动元素)。
  • 自动内存管理:动态分配和释放内存,不需要手动操作。
  • 迭代器支持:支持 STL 风格的迭代器,方便遍历和操作。

3. 常用函数

3.1 元素访问

函数功能说明
at(index)返回指定索引的元素,带边界检查。
operator[index]返回指定索引的元素,不进行边界检查。
front()返回第一个元素。
back()返回最后一个元素。
data()返回指向底层数组的指针。

3.2 容量操作

函数功能说明
size()返回当前元素数量。
capacity()返回当前分配的存储容量。
empty()判断是否为空。
resize(n, val)调整大小为 n,多余部分用 val 填充,默认值为 0
reserve(n)增加存储容量至至少 n(不会改变元素数量)。
shrink_to_fit()释放未使用的内存,调整容量以适应当前大小。

3.3 修改操作

函数功能说明
push_back(val)在尾部添加一个元素。
pop_back()移除尾部元素。
insert(pos, val)在迭代器 pos 指定位置插入元素 val
erase(pos)删除迭代器 pos 指向的元素。
clear()清空所有元素。
assign(n, val)将容器填充为 nval
emplace_back(args)在尾部直接构造元素(避免拷贝,提高性能)。

4. 示例代码

4.1 基本使用

#include <vector>
#include <iostream>
using namespace std;int main() {vector<int> nums;// 添加元素nums.push_back(10);nums.push_back(20);nums.push_back(30);// 遍历元素for (int i = 0; i < nums.size(); i++) {cout << nums[i] << " ";}cout << endl;// 删除尾部元素nums.pop_back();// 使用迭代器遍历for (auto it = nums.begin(); it != nums.end(); ++it) {cout << *it << " ";}cout << endl;return 0;
}

输出:

10 20 30
10 20

4.2 动态调整大小

#include <vector>
#include <iostream>
using namespace std;int main() {vector<int> nums(5, 1);  // 初始化大小为 5,每个元素值为 1cout << "Initial size: " << nums.size() << endl;nums.resize(8, 2);  // 调整大小为 8,新增元素值为 2for (auto num : nums) {cout << num << " ";}cout << endl;nums.shrink_to_fit();  // 调整容量以匹配大小cout << "Size after shrinking: " << nums.size() << endl;return 0;
}

输出:

Initial size: 5
1 1 1 1 1 2 2 2
Size after shrinking: 8

4.3 插入和删除元素

#include <vector>
#include <iostream>
using namespace std;int main() {vector<int> nums = {10, 20, 30, 40};// 插入元素nums.insert(nums.begin() + 2, 25);  // 在第三个位置插入 25// 删除元素nums.erase(nums.begin());  // 删除第一个元素for (auto num : nums) {cout << num << " ";}return 0;
}

输出:

20 25 30 40

5. 注意事项

  1. 随机访问性能优越:由于 std::vector 的底层是动态数组,支持通过索引直接访问元素,性能为 ( O(1) )。
  2. 插入和删除:在尾部操作效率高,复杂度为 ( O(1) );在中间或前部操作可能需要移动大量元素,复杂度为 ( O(n) )。
  3. 容量管理
    • 容量 capacity 通常大于或等于当前大小 size
    • 使用 reserve() 可以预先分配内存,减少动态扩展的次数。
  4. 迭代器失效
    • 动态扩展或删除元素时,可能会导致迭代器失效。
  5. 内存使用shrink_to_fit() 可释放未使用的内存。

6. 应用场景

6.1 动态数组

当数组大小在运行时需要动态变化时,使用 std::vector 更加合适。

#include <vector>
#include <iostream>
using namespace std;int main() {int n;cin >> n;vector<int> nums;for (int i = 0; i < n; i++) {nums.push_back(i);}for (auto num : nums) {cout << num << " ";}return 0;
}

6.2 多维数组

通过嵌套 std::vector 创建动态二维数组。

#include <vector>
#include <iostream>
using namespace std;int main() {int rows = 3, cols = 4;vector<vector<int>> matrix(rows, vector<int>(cols, 0));// 修改元素matrix[1][2] = 5;// 输出矩阵for (auto& row : matrix) {for (auto& elem : row) {cout << elem << " ";}cout << endl;}return 0;
}

输出:

0 0 0 0 
0 0 5 0 
0 0 0 0

7. 总结表

特性说明
动态大小支持动态增删元素,内存由容器管理。
连续存储元素在内存中是连续存储,适合随机访问。
操作效率随机访问为 ( O(1) ),尾部插入/删除为 ( O(1) )。
插入/删除限制中间或前部插入/删除效率低,可能导致大量元素移动。
多维支持可以嵌套 std::vector,实现动态二维/三维数组。
迭代器支持支持 STL 风格迭代器,方便遍历和操作。

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

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

相关文章

DolphinScheduler自身容错导致的服务器持续崩溃重大问题的排查与解决

01 问题复现 在DolphinScheduler中有如下一个Shell任务&#xff1a; current_timestamp() { date "%Y-%m-%d %H:%M:%S" }TIMESTAMP$(current_timestamp) echo $TIMESTAMP sleep 60 在DolphinScheduler将工作流执行策略设置为并行&#xff1a; 定时周期调度设置…

CISAW-ES应急服务方向信息安全事件分级

网络安全事件事件分级 网络安全事件分为四级&#xff1a;特别重大网络安全事件、重大网络安全事大网络安全事件、一般网络安全事件。 1&#xff0e;特别重大网络安全事件 符合下列情形之一的&#xff0c;为特别重大网络安全事件。 &#xff08;1&#xff09;重要网络和信息系…

油猴支持阿里云自动登陆插件

遇到的以下问题,都已在脚本中解决: 获取到的元素赋值在页面显示,但是底层的value并没有改写,导致请求就是获取不到数据元素的加载时机不定,尤其是弱网情况下,只靠延迟还是有可能获取不到,且登陆不丝滑,通过元素发现机制,解决此问题并做到丝滑登陆根据密钥计算校验码之…

B树与B+树:数据库索引的秘密武器

想象一下&#xff0c;你正在构建一个超级大的图书馆&#xff0c;里面摆满了各种各样的书籍。B树和B树就像是两种不同的图书分类和摆放方式&#xff0c;它们都能帮助你快速找到想要的书籍&#xff0c;但各有特点。 B树就像是一个传统的图书馆摆放方式&#xff1a; 1. 书籍摆放&…

城市生命线安全综合监管平台

【落地产品&#xff0c;有需要可留言联系&#xff0c;支持项目合作或源码合作】 一、建设背景 以关于城市安全的重要论述为建设纲要&#xff0c;聚焦城市安全重点领域&#xff0c;围绕燃气爆炸、城市内涝、地下管线交互风险、第三方施工破坏、供水爆管、桥梁坍塌、道路塌陷七…

成为LabVIEW自由开发者

成为LabVIEW自由开发者的体验可以非常丰富且具有挑战性&#xff0c;同时也充满了自我成长和多样化项目的机会。 ​ 1. 高度的灵活性与自由度 工作时间与地点&#xff1a;作为自由开发者&#xff0c;你可以自由选择工作时间和地点。你可以在家工作&#xff0c;也可以选择在咖啡…

用于与多个数据库聊天的智能 SQL 代理问答和 RAG 系统(3) —— 基于 LangChain 框架的文档检索与问答功能以及RAG Tool的使用

介绍基于 LangChain 框架的文档检索与问答功能&#xff0c;目标是通过查询存储的向量数据库&#xff08;VectorDB&#xff09;&#xff0c;为用户的问题检索相关内容&#xff0c;并生成自然语言的答案。以下是代码逻辑的详细解析&#xff1a; 代码结构与功能 初始化环境与加载…

基于QT和C++的实时日期和时间显示

一、显示在右下角 1、timer.cpp #include "timer.h" #include "ui_timer.h" #include <QStatusBar> #include <QDateTime> #include <QMenuBar> Timer::Timer(QWidget *parent) :QMainWindow(parent),ui(new Ui::Timer) {ui->setup…

Elasticsearch学习(1) : 简介、索引库操作、文档操作、RestAPI、RestClient操作

目录 1.elasticsearch简介1.1.了解es1.2.倒排索引正向索引和倒排索引 1.3.es的一些概念:文档和字段&#xff1b;索引和映射&#xff1b;Mysql与ES1.4.安装es、kibana部署单点es部署kibanaIK分词器安装IK分词器与测试扩展与停用词词典总结 部署es集群 2.索引库操作2.1.mapping映…

【LeetCode Hot100 贪心算法】 买卖股票的最佳时机、跳跃游戏、划分字母区间

贪心算法 买卖股票的最佳时机买卖股票的最佳时机II跳跃游戏跳跃游戏II划分字母区间 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的…

如何在 Ubuntu 22.04 上使用 LEMP 安装 WordPress 教程

简介&#xff1a; 本教程旨在指导你如何在 Ubuntu 22.04 上使用 LEMP 栈安装 WordPress。 WordPress 是一个用 PHP 编写的开源内容管理系统。LEMP 栈是 Linux&#xff0c;NGINX&#xff0c;MySQL 和 PHP 的缩写。WordPress 非常用户友好&#xff0c;并提供了多种选项&#xff…

vue实现虚拟列表滚动

<template> <div class"cont"> //box 视图区域Y轴滚动 滚动的是box盒子 滚动条显示的也是因为box<div class"box">//itemBox。 一个空白的盒子 计算高度为所有数据的高度 固定每一条数据高度为50px<div class"itemBox" :st…

STM32小实验2

定时器实验 TIM介绍 TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断…

HTB:Timelapse[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 提取并保存靶机TCP开放端口号 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机UD…

【贵州省】乡镇界arcgis格式shp数据乡镇名称和编码内容下载测评

shp数据字段乡镇名称和编码&#xff0c;坐标是wgs84&#xff0c;数据为SHP矢量格式&#xff0c;下载下来直接加载进ArcMap即可使用 下载地址&#xff1a;https://download.csdn.net/download/zhongguonanren99/14928126

[免费]微信小程序(高校就业)招聘系统(Springboot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序(高校就业)招聘系统(Springboot后端Vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序(高校就业)招聘系统(Springboot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项目介绍…

“AI智能实训系统:让学习更高效、更轻松!

大家好&#xff0c;作为一名资深产品经理&#xff0c;今天我来跟大家聊聊一款备受瞩目的产品——AI智能实训系统。在这个人工智能技术飞速发展的时代&#xff0c;AI智能实训系统应运而生&#xff0c;为广大学习者提供了全新的学习体验。那么&#xff0c;这款产品究竟有哪些亮点…

Linux下字符设备驱动编写(RK3568)

文章目录 一 基础知识概念特点常见应用场景 二 linux 下的字符设备字符设备在 /dev 目录下用 ls -l 命令查看字符设备文件类型主设备号和次设备号 三 字符驱动模块的编写1. 头文件引入2. 定义错误码枚举3. 设备操作函数定义4. 关键结构体与变量定义5. 驱动入口函数&#xff08;…

【ROS2】RViz2加载URDF模型文件

1、RViz2加载URDF模型文件 1)运行RViz2 rviz22)添加组件:RobotModel 3)选择通过文件添加 4)选择URDF文件,此时会报错,需要修改Fixed Frame为map即可 5)因为没有坐标转换,依然会报错,下面尝试解决 2、运行坐标转换节点 1)运行ROS节点:robot_state_publishe

大数据组件(三)快速入门实时计算平台Dinky

大数据组件(三)快速入门实时计算平台Dinky Dinky 是一个开箱即用的一站式实时计算平台&#xff08;同样&#xff0c;还有StreamPark&#xff09;&#xff0c;以 Apache Flink 为基础&#xff0c;连接数据湖仓等众多框架&#xff0c;致力于流批一体和湖仓一体的建设与实践。 Di…