当前位置: 首页 > 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 不再需要扩容。

http://www.lryc.cn/news/117001.html

相关文章:

  • 【vue3】elementPlus主题色定制
  • MATLAB 2023a的机器学习、深度学习
  • 【Python实际使用】Python提取pdf中的表格数据输出到excel(含代码实例)
  • css的transform样式计算-第一节
  • C++中vector、list和deque的选择:什么时候使用它们?
  • 【力扣每日一题】2023.8.10 下降路径最小和Ⅱ
  • gh-ost概述(二实践)
  • 临时文档3
  • 【OpenGauss源码学习 —— 执行算子(SeqScan算子)】
  • Postman中,既想传递文件,还想传递多个参数(后端)
  • 跨境干货|TikTok变现的9种方法
  • Grafana 曲线图报错“parse_exception: Encountered...”
  • idea中提示Unsupported characters for the charset ‘ISO-8859-1‘
  • 通过signtool进行数字签名和验证签名
  • geeemap学习总结(2)——地图底图应用
  • flutter 手写日历组件
  • C++动态规划经典试题解析之打家劫舍系列
  • 24届近5年东南大学自动化考研院校分析
  • electron、electron-forge 安装
  • go的strings用法
  • echo用法、linxu课堂练习题、作业题
  • WordPress使用【前端投稿】功能时为用户怎么添加插入文章标签
  • 第二章:CSS基础进阶-part1:CSS高级选择器
  • js 正则表达式 限制input元素内容必须以abc开头,123结尾
  • Linux下安装nginx (tar解压版安装)
  • 不同组件之间相互传递信息的方式(拓展知识)
  • idea找不到DataBase
  • 研发工程师玩转Kubernetes——PVC使用Label和storage选择PV
  • 【VUE】localStorage、indexedDB跨域数据操作实战笔记
  • 四、web应用程序技术——HTTP