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

【C/C++】std::vector 优化点(官方同步)

  1. 预分配空间:使用 reserve() 方法预分配 vector 的空间,避免频繁的内存分配和拷贝操作。

  2. 使用 emplace_back():使用 emplace_back() 方法插入元素,避免了拷贝构造函数的调用,提高了插入效率。

  3. 使用移动语义:使用移动语义避免了拷贝构造函数和拷贝赋值运算符的调用,提高了元素的插入和删除效率。

  4. 使用 shrink_to_fit():使用 shrink_to_fit() 方法释放 vector 中多余的空间,减少内存占用。

  5. 使用迭代器遍历元素:使用迭代器遍历 vector 的元素,可以避免使用下标访问时的边界检查和拷贝操作,提高遍历效率。

  6. 使用局部变量存储 vector 的元素:在函数内部使用 vector 时,可以将 vector 的元素存储在局部变量中,避免频繁的内存分配和拷贝操作。

  7. 使用 vector 替代 bool 数组:vector 是专门针对 bool 类型进行优化的容器,可以将多个 bool 值压缩为一个字节存储,减少内存占用。

  8. 使用指针或引用访问元素:使用指针或引用访问 vector 的元素,可以避免拷贝操作,提高访问效率。

  9. 使用 std::move():使用 std::move() 将元素从一个 vector 移动到另一个 vector,避免了拷贝构造函数和拷贝赋值运算符的调用,提高了元素的移动效率。

  10. 使用 std::vector::data():使用 std::vector::data() 方法获取 vector 的底层数据指针,可以避免拷贝操作,提高访问效率。

具体解释:
1.
使用 reserve() 方法可以在不改变 vector 元素数量的情况下,预留一定的空间,避免频繁的内存分配和拷贝操作。reserve() 方法的使用方法如下:

#include <vector>int main() {std::vector<int> vec;vec.reserve(100); // 预留 100 个元素的空间// 插入元素for (int i = 0; i < 100; ++i) {vec.push_back(i);}return 0;
}

在上面的代码中,我们使用 reserve() 方法预留了 100 个元素的空间,然后使用 push_back() 方法插入了 100 个元素。由于预留了足够的空间,vector 不需要频繁地进行内存分配和拷贝操作,提高了插入效率。

需要注意的是,reserve() 方法只会预留空间,不会改变 vector 的元素数量。如果在预留空间后,直接使用下标访问 vector 的元素,可能会访问到未初始化的内存,导致程序出错。因此,在使用 reserve() 方法时,需要确保在插入元素之前,vector 的元素数量不会超过预留的空间。

使用 shrink_to_fit() 方法可以释放 vector 中多余的空间,将 vector 的容量缩小到与元素数量相等的大小。shrink_to_fit() 方法的使用方法如下:

#include <vector>int main() {std::vector<int> vec;vec.reserve(100); // 预留 100 个元素的空间// 插入元素for (int i = 0; i < 100; ++i) {vec.push_back(i);}vec.shrink_to_fit(); // 释放多余的空间return 0;
}

在上面的代码中,我们使用 reserve() 方法预留了 100 个元素的空间,然后使用 push_back() 方法插入了 100 个元素。最后,我们使用 shrink_to_fit() 方法释放了多余的空间,将 vector 的容量缩小到与元素数量相等的大小。

需要注意的是,shrink_to_fit() 方法只会释放多余的空间,不会改变 vector 的元素数量。如果在释放空间后,继续插入元素,vector 可能会重新分配内存空间,导致之前的优化失效。因此,在使用 shrink_to_fit() 方法时,需要确保 vector 不再需要扩容。

相关文章:

【C/C++】std::vector 优化点(官方同步)

预分配空间&#xff1a;使用 reserve() 方法预分配 vector 的空间&#xff0c;避免频繁的内存分配和拷贝操作。 使用 emplace_back()&#xff1a;使用 emplace_back() 方法插入元素&#xff0c;避免了拷贝构造函数的调用&#xff0c;提高了插入效率。 使用移动语义&#xff1…...

【vue3】elementPlus主题色定制

以scss语言为例 1、element-plus自动按需导入配置&#xff0c;可参考官网按需导入模块 安装element-plus及辅助插件 npm i element-plus --save安装辅助插件 npm install -D unplugin-vue-components unplugin-auto-import安装sass npm i sass -D2、vite.config.js 中配置…...

MATLAB 2023a的机器学习、深度学习

MATLAB 2023版的深度学习工具箱&#xff0c;提供了完整的工具链&#xff0c;使您能够在一个集成的环境中进行深度学习的建模、训练和部署。与Python相比&#xff0c;MATLAB的语法简洁、易于上手&#xff0c;无需繁琐的配置和安装&#xff0c;让您能够更快地实现深度学习的任务。…...

【Python实际使用】Python提取pdf中的表格数据输出到excel(含代码实例)

前两天有朋友问我&#xff0c;你能不能帮我把pdf中的表格数据抓出来&#xff0c;输出到excel中&#xff0c;我说我试试。 最近看资料发现python有很多库都可以完成pdf中的表格数据抓取&#xff0c;选择其中一种尝试&#xff1a;pdfplumber。 一、简单介绍 在使用之前我们简单…...

css的transform样式计算-第一节

本文作者为 360 奇舞团前端开发工程师 引言 在使用 css 样式进行样式的缩放、旋转等设置时&#xff0c;思考了一下它的较浅层的原理&#xff0c;恩&#xff0c;这个阶段都 是一些初高的数学计算&#xff0c;从新看这里的时候顺便捡了捡初高中的数学&#xff0c;比如三角函数之类…...

C++中vector、list和deque的选择:什么时候使用它们?

系列文章目录 文章目录 系列文章目录前言一、vector二、list三、deque总结 前言 在C中&#xff0c;vector、list和deque是STL&#xff08;标准模板库&#xff09;提供的三种常见的容器。每种容器都有其特点和适用场景。本文将详细介绍vector、list和deque的特点以及它们的适用…...

【力扣每日一题】2023.8.10 下降路径最小和Ⅱ

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个数组&#xff0c;让我们模拟从上面第一层走到下面的最后一层&#xff0c;下降路径需要加上经过的格子的值&#xff0c;每层…...

gh-ost概述(二实践)

注意&#xff1a;只适用于拥有主键或者唯一键的表&#xff0c;不存在触发器的表 一、gh-ost的安装部署 0、yum -y install golang 1、进入官网GitHub - github/gh-ost: GitHub’s Online Schema-migration Tool for MySQL 2、下载gh-ost-master.zip包 3、解压unzip gh-ost-mast…...

临时文档3

Set接口 说一下 HashSet 的实现原理&#xff1f; HashSet 是基于 HashMap 实现的&#xff0c;HashSet的值存放于HashMap的key上&#xff0c;HashMap的value统一为PRESENT&#xff0c;因此 HashSet 的实现比较简单&#xff0c;相关 HashSet 的操作&#xff0c;基本上都是直接调…...

【OpenGauss源码学习 —— 执行算子(SeqScan算子)】

执行算子&#xff08;SeqScan算子&#xff09; 执行算子概述扫描算子SeqScan算子ExecInitSeqScan函数InitScanRelation函数ExecSeqScan函数 总结 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵…...

Postman中,既想传递文件,还想传递多个参数(后端)

需求:既想传文件又想传多个参数可以用以下方式实现...

跨境干货|TikTok变现的9种方法

在这个流量为王的时代&#xff0c;哪里有流量&#xff0c;哪里就有商机。TikTok作为近几年最火爆的社媒平台之一&#xff0c;在全球范围都具有一定的影响力。随着TikTok Shop等商务功能加持上线&#xff0c;更是称为跨境电商的新主场之一。 在这样的UGC平台&#xff0c;想要变…...

Grafana 曲线图报错“parse_exception: Encountered...”

问题现象 配置的Grafana图报错如下&#xff1a; 原因分析 点开报错&#xff0c;可以看到报错详细信息&#xff0c;是查询语句的语法出现了异常。 变量pool的取值为None 解决方案 需要修改变量pool的查询SQL&#xff0c;修改效果如下&#xff1a; 修改后&#x…...

idea中提示Unsupported characters for the charset ‘ISO-8859-1‘

application.properties中文注释拉黄线 &#xff0c;提示Unsupported characters for the charset ISO-8859-1 解决办法&#xff1a; 注意&#xff1a; 改完之后之前输入的中文就变成“ &#xff1f;&#xff1f;&#xff1f;”了&#xff0c;建议备份一下 1、打开setti…...

通过signtool进行数字签名和验证签名

&#xff08;一&#xff09;如何签名 SignTool.exe (Sign Tool) - .NET Framework | Microsoft Learn Using SignTool to Sign a File - Win32 apps | Microsoft Learn 签名命令行&#xff1a; signtool.exe sign /f xxx.pfx /t http://timestamp.digicert.com yyy.dll xx…...

geeemap学习总结(2)——地图底图应用

1. 加载库中已有图层 import os os.environ[HTTP_PROXY] http://127.0.0.1:8001 os.environ[HTTPS_PROXY] http://127.0.0.1:8001 # 设置中心位置/地图层级/图层加载高度&#xff0c;加载图层 import geemap Mapgeemap.Map(center[40, 100], zoom4, height600) Map# 添加已经…...

flutter 手写日历组件

先看效果 直接上代码 calendar_popup_view.dart import package:flutter/material.dart; import package:intl/intl.dart;import custom_calendar.dart; import hotel_app_theme.dart;class CalendarPopupView extends StatefulWidget {const CalendarPopupView({required th…...

C++动态规划经典试题解析之打家劫舍系列

1.前言 力扣上有几道与打家劫舍相关的题目,算是学习动态规划时常被提及的经典试题,很有代表性,常在因内大大小小的社区内看到众人对此类问题的讨论。 学习最好的方式便是归纳总结、借鉴消化,基于这个目的,本文对此类问题也做了讲解,在一些优秀思想的基础上添加了个人观…...

24届近5年东南大学自动化考研院校分析

今天给大家带来的是东南大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、东南大学 学校简介 东南大学是我国最早建立的高等学府之一&#xff0c;素有“学府圣地”和“东南学府第一流”之美誉。东南大学前身是创建于1902年的三江师范学堂。1921年经近代著名教育家…...

electron、electron-forge 安装

npm修改了registry&#xff0c;安装依旧无效 使用cnpm 倒是可以解决&#xff0c;但是 npx electron-forge import 中 Installing dependencies 使用的是npm 给出一次性解决方案&#xff1a; step1&#xff1a;切换npm的下载源&#xff0c;可以使用nrm 进行管理&#xff0c;有…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...