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

c++ STL系列——(二)vector

引言

在现代C++编程中,std::vector是最常用的动态数组实现之一,它是C++标准模板库(STL)的一部分。vector提供了一种方式,以单一数据结构来存储元素集合,并且可以动态地调整大小以适应新元素。本文将深入探讨vector的设计理念、特性、使用方法及其优缺点,帮助开发者更好地理解和利用这一强大的工具。

Vector的设计理念

std::vector背后的主要设计理念是提供一种灵活、高效的动态数组实现。与静态数组相比,vector能够在运行时动态地增加或减少容量,同时保持随机访问的特性。vector通过在堆上分配内存并在需要时重新分配更大的内存块来实现动态扩容,从而使得元素的添加操作变得非常灵活。

Vector的核心特性

  • 自动管理内存vector自动管理其存储元素所需的内存。当向vector添加元素,超出其当前容量时,它会自动分配更大的内存空间以容纳新元素。
  • 快速随机访问vector提供了对其元素的快速随机访问,即通过索引直接访问任何元素的时间复杂度为O(1)。
  • 动态调整大小vector可以在运行时根据需要增加或减少其大小,这使得它比静态数组更加灵活。
  • 连续存储vector的所有元素都存储在连续的内存块中,这有利于提高空间和时间局部性,从而提高缓存效率。

使用Vector

基本操作

#include <iostream>
#include <vector>int main() {// 创建一个空的vectorstd::vector<int> vec;// 添加元素vec.push_back(10);vec.push_back(20);// 随机访问std::cout << "第一个元素: " << vec[0] << std::endl;// 使用迭代器遍历for(auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << std::endl;}// 删除最后一个元素vec.pop_back();// 获取vector的大小std::cout << "Vector的大小: " << vec.size() << std::endl;return 0;
}

容量管理

vector提供了多种方法来管理其容量,例如reserve()可以预先分配足够的内存以避免频繁的内存重新分配,而shrink_to_fit()可以请求移除未使用的容量,以节省内存。

注意事项

  • 迭代器失效:向vector添加元素可能会导致存储空间重新分配,进而使得所有指向vector元素的迭代器、引用和指针失效。
  • 性能考虑:虽然vector的元素添加操作通常很快,但如果在vector前面插入或删除元素,则可能导致较高的性能成本,因为这需要移动后续的所有元素。

Vector的优缺点

优点

  • 灵活性vector可以根据需要动态调整大小,非常适合不知道确切元素数量的情况。
  • 高效的元素访问:提供了快速的随机访问能力。
  • 自动内存管理:自动处理内存分配和释放,减轻了程序员的负担。

缺点

  • 可能的内存重新分配:如果频繁地向vector添加元素,可能会引起多次内存重新分配,影响性能。
  • 不适合前端操作:在vector的前端插入或删除元素效率低下,因为这涉及到移动大量元素。

结语

std::vector是C++ STL中一个非常重要和强大的组件,它结合了数组的高效元素访问和链表的动态大小调整的优点。正确地使用vector可以极大地提高编程效率和程序性能。然而,为了最大限度地发挥其潜力,开发者需要理解其内部工作原理和性能特性,以及如何根据具体需求选择合适的操作。希望本文能帮助你更深入地理解std::vector,并在日常开发中有效地使用它。

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

相关文章:

  • STM32能够做到数据采集和发送同时进行吗?
  • 5.Swift常量
  • Linux运行级别 | 管理Linux服务
  • Nginx 配置 SSL证书
  • 如何正确理解和获取S参数
  • Sping Cloud Hystrix 参数配置、简单使用、DashBoard
  • CSS太极动态图
  • TI毫米波雷达开发——High Accuracy Demo 串口数据接收及TLV协议解析 matlab 源码
  • 基于tomcat运行jenkins常见的报错处理
  • 算法学习——LeetCode力扣二叉树篇1
  • 二叉树的遍历及创建
  • 图形学:Transform矩阵(3维 2维) 平移,旋转,缩放
  • Docker学习历程
  • Android:Volley框架使用
  • 前端修炼手册(uniapp的api篇)
  • JAVA面试题16
  • P1044 [NOIP2003 普及组] 栈题解
  • 【DSP】数字信号处理发展里程碑(AI【文心一言】 辅助生成)
  • 【JavaScript 】finally() 方法和Filter() 方法
  • 假期作业8
  • 基于vue+node.js的校园跳蚤市场系统多商家
  • Linux操作系统基础(六):Linux常见命令(一)
  • 【Android-Compose】Material3 新版下拉刷新 PullRefresh
  • FANUC机器人外部远程启动的相关参数设置示例
  • 供货商、品牌方、供应链如何对接快团团头部大团长?这三个关键点你一定要记住
  • LLMs之Llama2 70B:《Self-Rewarding Language Models自我奖励语言模型》翻译与解读
  • 电商小程序06用户审核
  • vue3跨组件(多组件)通信:事件总线【Event Bus】
  • 教材管理系统
  • PV、UV、IP