当前位置: 首页 > article >正文

C++ Vector深度易错点指南(临时抱佛脚)(基础用法;进阶;高级;实战)

Vector

  • 1. Vector 基础概念
    • 1.1 内存结构
    • 1.2 初始化方法
    • 2.1 访问方式对比
    • 2.2 遍历流程
    • 3.1 扩容流程
    • 3.2 迭代器失效
      • 3.2.1 插入操作导致迭代器失效
      • 3.2.2 删除操作导致迭代器失效
      • 3.2.3 避免迭代器失效的建议
    • 4.1 排序与去重
      • 排序
      • 去重
      • 性能分析
    • 4.2 查找与条件删除
      • 查找
      • 条件删除
      • 性能分析
    • 5.1 内存模型
    • 5.2 正确初始化
      • 5.2.1 使用默认构造函数初始化
      • 5.2.2 使用初始化列表初始化
      • 5.2.3 使用构造函数初始化
      • 5.2.4 动态初始化
      • 错误示例 ❌
      • 修正方法 ✅
    • 6.1 预分配内存
      • 6.1.1 为什么需要预分配内存
      • 6.1.2 如何预分配内存
      • 6.1.3 性能对比
      • 6.1.4 注意事项
    • 6.2 避免不必要的拷贝
      • 6.2.1 使用引用传递
      • 6.2.2 使用 `std::move`
      • 6.2.3 使用 `emplace_back`
      • 6.2.4 避免临时对象的生成
    • 7.1 基础概念与初始化
    • 7.2 元素访问与遍历
    • 7.3 动态扩容与陷阱
    • 7.4 STL 算法与 Vector 结合
    • 7.5 二维 Vector
    • 7.6 进阶优化技巧

1. Vector 基础概念

1.1 内存结构

std::vector 是 C++ 标准模板库(STL)中的一个动态数组容器,其内存结构由三部分组成:

  • 动态数组指针 data:指向实际存储元素的连续内存区域,这是 std::vector 的核心,使得其能够通过下标快速访问元素。
  • 当前元素数量 size:记录当前存储在 std::vector 中的元素个数,反映了 std::vector 中实际使用的内存大小。
  • 预分配内存容量 capacity:表示 std::vector 已经分配的内存大小,通常大于或等于 size。当向 std::vector 中添加元素时,如果 size 超过了 capacitystd::vector 会自动扩容,重新分配更大的内存空间,并将原有元素复制到新内存中,这一过程会带来额外的性能开销。

这种内存结构使得 std::vector 兼具动态数组的灵活性和静态数组的高效性,能够根据需要自动调整大小,同时保证了对元素的快速随机访问。

1.2 初始化方法

std::vector 提供了多种初始化方法,以满足不同的使用场景:

  • 默认初始化:创建一个空的 std::vector,不包含任何元素,sizecapacity 均为 0。

    std::vector<int> v1;
    
  • 指定大小初始化:创建一个包含指定数量元素的 std::vector,所有元素均初始化为默认值(对于基本数据类型为 0,对于自定义类型则调用默认构造函数)。

    std::vector<int> v2(5); // 创建一个包含 5 个 0 的 vector
    
  • 指定大小和初始值初始化:创建一个包含指定数量元素的 std::vector,并将所有元素初始化为指定的值。

    std::vector<int> v3(3, 100); // 创建一个包含 3 个 100 的 vector
    
  • 列表初始化(C++11 及以上版本支持):使用花括号 {} 将一组元素初始化到 std::vector 中,这种方式直观且方便。

    std::vector<int> v4 = {1, 2, 3}; // 使用列表初始化
    
  • 拷贝初始化:通过已有的 std::vector 创建一个新的 std::vector,新 std::vector 中的元素是原 std::vector 中元素的副本。

    std::vector<int> v5(v4); // 拷贝初始化
    

这些初始化方法为用户提供了灵活的选择,能够根据具体需求快速创建并初始化 std::vector,从而提高编程效率。# 2. 元素访问与遍历

2.1 访问方式对比

std::vector 提供了多种访问元素的方式,每种方式都有其特点和适用场景。以下是几种常见的访问方式对比:

访问方式代码示例越界检查性能适用场景
下标操作符 []v[0]快速访问已知索引且确保安全时
at() 方法v.at(0)较慢需要安全访问时
迭代器*it快速访问遍历或算法操作
  • 下标操作符 []:通过索引直接访问元素,性能高,但不进行越界检查。如果索引超出范围,程序可能会崩溃或出现未定义行为。

    std::vector<int> v = {1, 2, 3};
    int first = v[0]; // 访问第一个元素
    
  • at() 方法:提供范围检查,如果索引超出范围,会抛出 std::out_of_range 异常。虽然安全性更高,但性能略低于下标操作符。

    std::vector<int> v = {1, 2, 3};
    int first = v.at(0); // 安全访问第一个元素
    
  • 迭代器:通过迭代器访问元素,适用于遍历整个容器或在算法中使用。迭代器提供了指针类似的语法,但不进行越界检查。

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

2.2 遍历流程

遍历 std::vector 的过程可以通过迭代器或范围 for 循环实现。以下是遍历的流程图和代码实现:

开始遍历
是否还有元素?
访问当前元素
移动到下一个元素

相关文章:

C++ Vector深度易错点指南(临时抱佛脚)(基础用法;进阶;高级;实战)

Vector 1. Vector 基础概念1.1 内存结构1.2 初始化方法2.1 访问方式对比2.2 遍历流程3.1 扩容流程3.2 迭代器失效3.2.1 插入操作导致迭代器失效3.2.2 删除操作导致迭代器失效3.2.3 避免迭代器失效的建议4.1 排序与去重排序去重性能分析4.2 查找与条件删除查找条件删除性能分析5…...

深入解析WPF中的3D图形编程:材质与光照

引言 在Windows Presentation Foundation (WPF) 中创建三维(3D)图形是一项既有趣又具有挑战性的任务。为了帮助开发者更好地理解如何使用WPF进行3D图形的渲染&#xff0c;本文将深入探讨GeometryModel3D类及其相关的材质和光源设置。 1、GeometryModel3D类简介 GeometryMode…...

SolidWork-2023 鼠標工程

地址 https://github.com/MartinxMax/SW2023-Project/tree/main/mouse 鼠標...

vscode预览模式(点击文件时默认覆盖当前标签,标签名称显示为斜体,可通过双击该标签取消)覆盖标签、新窗打开

文章目录 VS Code 预览模式如何取消预览模式&#xff08;即“固定”标签页&#xff09;&#xff1f;预览模式有什么用&#xff1f; VS Code 预览模式 在 VS Code 中&#xff0c;当你单击文件浏览器&#xff08;例如&#xff0c;资源管理器侧边栏&#xff09;中的某个文件时&am…...

记录踩过的坑-金蝶云苍穹平台-轻分析和轻报表(慢慢更新)

未发现AppIdName(qing rpt)服务或访问服务网络异常 前提是有许可和权限。 去console&#xff08;云基础平台控制台&#xff09;&#xff0c;点击服务管理&#xff0c;编辑mservice-更新升级-环境变量&#xff0c;在appIds里增加qing_rpt 查看数据库 如果是采用公共数据源连接…...

每日一题洛谷T534125 合数c++

字符串输入&#xff0c;看所有位数加起来的数是不是3的倍数 是&#xff0c;直接输出&#xff0c;不是&#xff0c;删除1或2 特判全是1和全是2的情况 直接检测末尾数字可以特判2 特判1时&#xff0c;还要特判11和111&#xff0c;其他数字&#xff0c;k是奇数时是质数&#x…...

数据链共享:从印巴空战到工业控制的跨越性应用

摘要 本文通过对印巴空战中数据链共享发挥关键作用的分析&#xff0c;引出数据链共享在工业控制领域同样具有重大价值的观点。深入阐述 DIOS 工业控制操作系统作为工业数据链共享基础技术的特点、架构及应用优势&#xff0c;对比空战场景与工业控制场景下数据链共享的相…...

Go多服务项目结构优化:为何每个服务单独设置internal目录?

文章目录 Go多服务项目结构优化&#xff1a;为何每个服务单独设置internal目录&#xff1f;背景什么是 Go 的 internal 机制&#xff1f;传统根 internal 目录的局限为什么要每个服务单独设置 internal &#xff1f;推荐结构示例 总结 Go多服务项目结构优化&#xff1a;为何每个…...

图解gpt之Seq2Seq架构与序列到序列模型

今天深入探讨如何构建更强大的序列到序列模型&#xff0c;特别是Seq2Seq架构。序列到序列模型&#xff0c;顾名思义&#xff0c;它的核心任务就是将一个序列映射到另一个序列。这个序列可以是文本&#xff0c;也可以是其他符号序列。最早&#xff0c;人们尝试用一个单一的RNN来…...

Linux--JsonCpp

1.JsonCpp 简介 JsonCpp 是一个用于 C 的 JSON 解析和生成库&#xff0c;支持 JSON 数据的读写、解析和序列化。它提供了简单的 API 来操作 JSON 对象、数组、字符串、数字等类型&#xff0c;是 C 开发中处理 JSON 数据的常用工具。 核心功能与类 JsonCpp 主要包含以下核心类…...

程序代码篇---Python视频流

文章目录 前言一、OpenCV 视频流处理1. 视频捕获基础2. 视频流属性设置与获取3. 视频写入 二、高级视频流操作1. 多摄像头处理2. 视频流帧处理3. 视频流分析与统计 三、其他视频处理库1. PyAV (FFmpeg 的 Python 绑定)2. imageio 四、视频流处理优化技巧1. 多线程视频处理2. 视…...

如何利用 QuickAPI 生成 PostgreSQL 样本测试数据:全面解析与实用指南

目录 一、什么是 QuickAPI&#xff1f; 二、为什么需要生成样本测试数据&#xff1f; 三、如何在 QuickAPI 中生成 PostgreSQL 样本测试数据&#xff1f; 1. 登录 QuickAPI 平台 2. 选择 PostgreSQL 数据库和目标表 3. 配置样本数据生成规则 4. 导出或直接插入数据 四、…...

DeepSeek API接口调用示例(开发语言C#,替换其中key值为自己的key值即可)

示例&#xff1a; DeepSeek官方接口说明文档&#xff1a;对话补全 | DeepSeek API Docs 官网暂未提供C#代码实现&#xff1a;&#xff08;以下为根据CURL接口C#代码调用&#xff09; using System; using System.Collections.Generic; using System.Linq; using System.Text; …...

远程调试---在电脑上devtools调试运行在手机上的应用

1、启动项目–以vite项目为例:先ipconfig查看ip地址 ,然后在vite中配置host为ip地址 2、手机上查看项目:保证手机和电脑在同一局域网, 在手机浏览器打开我们vite启动的项目地址, 3、使用chii进行远程调试 (1) 安装 npm install chii -g (2)启动 chii start -p 8080 (3)在…...

[git]如何关联本地分支和远程分支

主题 本文总结如何关联git本地分支和远程分支的相关知识点。 详情 查看本地分支 git branch 查看远程分支 git branch -r 查看所有分支(本地远程) git branch -a 查看本地分支及其关联的远程分支(如有) git branch -vv 关联本地分支到远程分支&#xff1a; git branch …...

集群/微服务/分布式

目录 介绍 集群 微服务 优点 缺点 如何管理和监控微服务架构中的多个微服务&#xff1f; 服务治理 配置管理 监控与告警 容器化与编排 安全管理 分布式 三者关系 分布式和集群的区别是什么&#xff1f; 概念 工作方式 节点角色 应用场景 故障处理 微服务 微…...

红黑树删除的实现与四种情况的证明

&#x1f9ed; 学习重点 删除节点的三种情况红黑树如何恢复性质四种修复情况完整可运行的 C 实现 一、红黑树删除的基础理解 红黑树删除比插入复杂得多&#xff0c;因为&#xff1a; 删除的是黑节点可能会破坏“从根到叶子黑节点数相等”的性质。删除红节点无需修复&#xf…...

【Spring AI 实战】基于 Docker Model Runner 构建本地化 AI 聊天服务:从配置到函数调用全解析

【Spring AI 实战】基于 Docker Model Runner 构建本地化 AI 聊天服务&#xff1a;从配置到函数调用全解析 前沿&#xff1a;本地化 AI 推理的新范式 随着大语言模型&#xff08;LLM&#xff09;应用的普及&#xff0c;本地化部署与灵活扩展成为企业级 AI 开发的核心需求。Do…...

前台--Android开发

在 Android 开发中&#xff0c;“前台&#xff08;Foreground&#xff09;” 是一个非常重要的概念&#xff0c;它用于描述当前用户正在与之交互的组件或应用状态。理解“前台”的含义有助于更好地管理资源、生命周期和用户体验。 ✅ 一、什么是前台&#xff1f; 简单定义&…...

跨境电商生死局:动态IP如何重塑数据生态与运营效率

凌晨三点的深圳跨境电商产业园&#xff0c;某品牌独立站运营总监李明&#xff08;化名&#xff09;正盯着突然中断的广告投放系统。后台日志显示&#xff0c;过去24小时内遭遇了17次IP封禁&#xff0c;直接导致黑五促销期间损失23%的预期流量。这并非个案——2023年跨境电商行业…...

springboot3+vue3融合项目实战-大事件文章管理系统-更新用户信息

在一下三个代码处进行修改 在UserController里面增加uadate方法 PutMapping ("/update")public Result update(RequestBody Validated User user){userService.update(user);return Result.success();}在userservice中增加update方法 void update(User user); 然…...

气象大模型光伏功率预测中的应用:从短期,超短期,中长期的实现与开源代码详解

1. 引言 光伏功率预测对于电力系统调度、能源管理和电网稳定性至关重要。随着深度学习技术的发展,大模型(如Transformer、LSTM等)在时间序列预测领域展现出强大能力。本文将详细介绍基于大模型的光伏功率预测方法,涵盖短期(1-6小时)、超短期(15分钟-1小时)和中长期(1天-1周…...

深度学习:智能车牌识别系统(python)

这是一个基于opencv的智能车牌识别系统,有GUI界面。程序能自动识别图片中的车牌号码,并支持中文和英文字符识别,支持选择本地图片文件,支持多种图片格式(jpg、jpeg、png、bmp、gif)。 下面,我将按模块功能对代码进行分段说明: 1. 导入模块部分 import tkinter as tk…...

[杂谈随感-13]: 人的睡眠,如何布置床的位置比较有安全?感?

睡眠环境中的床位布置直接影响心理安全感与睡眠质量&#xff0c;需从空间防御性、人体感知机制及环境心理学多维度综合设计。 以下基于科学原理与实践案例&#xff0c;系统解析床位布置的核心策略&#xff1a; 一、空间防御性布局&#xff1a;构建心理安全边界 背靠实体墙&a…...

DNS服务实验

该文章将介绍DNS服务的正向和反向解析实验、主从实验、转发服务器实验以及Web解析实验 正向解析实验&#xff1a;将域名解析为对应的IP地址 反向解析实验&#xff1a;将IP地址解析为对应的域名 主从实验&#xff1a;主服务器区域数据文件发送给从服务器&#xff0c;从服务器…...

visual studio 2015 安装闪退问题

参考链接&#xff1a; VS2012安装时启动界面一闪而过问题解决办法 visual studio 2015 安装闪退问题...

C语言复习--动态内存管理

下面我们来看C语言中的动态内存管理,在之后的数据结构中会运用到C语言中的指针,结构体和动态内存管理,所以这部分还是比较重要的.下面进入正题. 为什么要有动态内存分配 但是上面的两种方式开辟的内存的大小都是固定的.数组也是,在数组开辟之前一定要确定好数组大小,并且数组开…...

Python实例题:Python协程详解公开课

目录 Python实例题 题目 课程目标 课程内容规划 1. 课程开场&#xff08;5 分钟&#xff09; 2. 基础概念讲解&#xff08;15 分钟&#xff09; 并发与并行&#xff1a; 线程与进程&#xff1a; 3. Python 协程的实现方式&#xff08;20 分钟&#xff09; 生成器实现…...

青藏高原七大河流源区径流深、蒸散发数据集(TPRED)

时间分辨率 月空间分辨率 1km - 10km共享方式 开放获取数据大小 83.27 MB数据时间范围 1998-07-01 — 2017-12-31元数据更新时间 2024-07-22 数据集摘要 通过构建耦合积雪、冻土、冰川等冰冻圈水文物理过程的WEB-DHM模型&#xff08;Water and Energy Budget-based Distribute…...

[学习]RTKLib详解:rtksvr.c与streamsvr.c

本文是 RTKLlib详解 系列文章的一篇&#xff0c;目前该系列文章还在持续总结写作中&#xff0c;以发表的如下&#xff0c;有兴趣的可以翻阅。 [学习] RTKlib详解&#xff1a;功能、工具与源码结构解析 [学习]RTKLib详解&#xff1a;pntpos.c与postpos.c [学习]RTKLib详解&…...