【C/C++笔记】vector list 和 deque 容器定义、区别及使用场景

2024-08-22 12:12

本文主要是介绍【C/C++笔记】vector list 和 deque 容器定义、区别及使用场景,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

vector list 和 deque 容器定义、区别及使用场景

list、vector 和 deque(double-ended queue,双端队列)都是C++标准模板库(STL)中的序列容器,用于存储元素集合。

vector容器:

定义:vector 是一个动态数组,可以看作是具有额外功能的C语言风格数组。
特点:

  • 提供对元素的直接访问,支持随机访问迭代器。
  • 在序列的末端进行插入和删除操作是高效的,但如果超出当前容量,可能需要进行内存重新分配。
  • 通常在内存中连续存储元素,可以提供很好的缓存局部性,适合频繁访问元素的场景。
  • 在容器大小变化时可能需要复制或移动所有元素到新内存位置。
  • 使用场景:当需要快速访问元素,并且插入和删除操作主要在序列的末端进行时使用。

list容器:

定义:list 是一个双向链表,提供在序列的任意位置高效插入和删除的能力。
特点:

  • 允许在任何位置进行高效的插入和删除操作。
  • 迭代器在遍历时是稳定的,即它们在列表元素被插入或删除时不会变得无效。
  • 不提供直接访问(随机访问)能力,访问元素需要从头或尾开始遍历。
  • 通常比 vector 和 deque 占用更多的内存。
  • 使用场景:当需要频繁在序列中插入或删除元素时使用,特别是当这些操作不是在序列的两端进行时。

deque容器:

定义:deque 是一个双端队列,提供在序列的两端快速添加和删除元素的能力。
特点:

  • 在两端添加和删除元素都是高效的。
  • 迭代器在遍历时是稳定的,类似于 list。
  • 支持直接访问元素,但通常不如 vector 提供的访问速度。
  • 内存分配可能不是连续的,因此缓存局部性不如 vector。
  • 使用场景:当需要在序列的前端或后端频繁进行插入或删除操作时使用,同时需要比 list 更快速的元素访问。

区别:

  • 内存分配:vector 通常连续分配内存,list 分配非连续内存,deque 可能连续也可能非连续。
  • 随机访问:vector 和 deque 支持随机访问,list 不支持。
  • 插入和删除效率:list 在任意位置插入和删除效率都很高,vector 在末端插入和删除效率高,deque 在两端插入和删除效率高。
  • 内存使用:list 由于存储额外的节点信息,通常使用更多的内存。

总结

在选择使用哪种容器时,需要根据实际的应用场景和性能要求来决定。例如,如果需要频繁插入和删除元素,且对随机访问没有要求,list 或 deque 可能是更好的选择。如果需要快速随机访问元素,并且插入和删除操作主要在序列末端进行,vector 可能更合适。

  • 如果程序要求随机访问元素,则应使用 vector 或 deque 容器。
  • 如果程序必须在容器的中间位置插入或删除元素,则应采用 list 容器。
  • 如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则应采用 deque 容器。
  • 如果只需在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑在输入时将元素读入到一个 list 容器,接着对此容器重新排序,使其适合顺序访问,然后将排序后的 list 容器复制到一个 vector 容器。

这篇关于【C/C++笔记】vector list 和 deque 容器定义、区别及使用场景的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1096238

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结