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

string,vector,deque容器的对比

一、std::string

1. 本质

  • std::basic_string<char>的特化,专门管理字符序列

  • 行为极像vector<char>,但增加了大量字符串专属操作(查找、子串、拼接、比较、c_str等)。

2. 内部实现

  • 连续内存存储字符,尾部有'\0'保证c_str()兼容C风格字符串。

  • 通常采用小字符串优化(SSO):短字符串直接存在对象内部,避免堆分配。

  • 动态扩容类似 vector(1.5倍或2倍增长)。

3. 常用操作

操作说明
s.length() / s.size()字符数(不含\0
s.c_str()返回C风格字符串
s.substr(pos, count)子串
s.find(str)查找
s.append(str)/+=追加
s.insert(pos, str)插入
s.erase(pos, len)删除
s.replace(pos, len, str)替换

4. 特点

  • 专为字符串设计,重载了+==<等运算符。

  • 有输入输出流操作>>,<<,getline

  • 支持数字转换:to_string,stoi,stod等。


二、std::vector

1. 本质

  • 动态数组,可随机访问任何元素,容量可自动增长。

  • 元素存储在一段连续内存上。

2. 内部实现

  • 三指针结构:start,finish,end_of_storage

  • 插入元素时如果容量不足,会重新分配一块更大的内存,将原元素拷贝/移动过去,并释放旧内存。

  • 扩容因子通常为 2 或 1.5。

3. 常用操作

操作说明
v.size()元素个数
v.capacity()当前分配内存能容纳的元素数
v.push_back(x)尾插
v.emplace_back(args...)尾部就地构造
v.pop_back()尾删
v.insert(it, x)任意位置插入,可能引起元素整体后移
v.erase(it)任意位置删除,可能引起元素整体前移
v.clear()清空(size=0,capacity不变)
v.shrink_to_fit()释放多余容量
v.reserve(n)预留容量,避免反复分配

4. 特点

  • 随机访问O(1),通过[]at()

  • 尾插/尾删均摊 O(1)

  • 头插/中间插入/删除O(n),因为需要移动元素。

  • 扩容会导致所有迭代器、指针、引用失效

  • 内存连续,缓存友好。


三、std::deque(双端队列)

1. 本质

  • 双端队列,支持在头部和尾部高效插入/删除。

  • 不是连续一整块内存,而是分段连续:多个定长数组通过指针数组(中枢控制块)连在一起。

2. 内部实现

  • 有一个“中控器”数组存储指向各段缓冲区的指针。

  • 每段缓冲区大小固定(如 512 字节或若干元素)。

  • 首尾插入时,若当前缓冲区满,则分配新缓冲区并加入中控器,无需移动原有元素。

  • 支持随机访问,但需要两级间接寻址(计算所在块 + 块内偏移)。

3. 常用操作

操作说明
d.push_back(x)/emplace_back尾插,均摊O(1)
d.push_front(x)/emplace_front头插,均摊O(1)
d.pop_back() / pop_front()尾/头删除,O(1)
d.insert(it, x)任意位置插入,O(n)(但如果靠近两端,移动元素较少)
d.erase(it)任意位置删除,O(n)
d[n]/d.at(n)随机访问,O(1)(比vector稍慢)

4. 特点

  • 首尾插入/删除非常快,不会引起大段元素移动

  • 任意位置插入/删除仍可能移动元素(选择移动较少的一端)。

  • 扩容时:中控器可能重新分配,但元素本身所在的缓冲区不移动,因此元素的指针和引用不会失效(但迭代器可能会失效)。

  • 与 vector 比,随机访问略慢,内存开销更大(多一级中控结构)。

  • 默认不提供reserve/capacity概念(或者说没有连续的 capacity 保障),但可调shrink_to_fit


四、三者的核心对比

特性stringvectordeque
存储内容字符任意类型 T任意类型 T
内存布局连续(含末尾\0严格连续分段连续
头插/头删效率O(n)O(n)O(1)
尾插/尾删效率O(1) 均摊O(1) 均摊O(1) 均摊
中间插入/删除O(n)O(n)O(n) (但可优化到移动少的一侧)
随机访问O(1)O(1)O(1)(略慢,需两次间接寻址)
扩容时元素移动整体迁移整体迁移不移动原有元素(只可能移动中控指针)
扩容迭代器/指针/引用失效全部失效全部失效引用和指针不失效,迭代器可能失效
SSO 优化
专属功能丰富字符串处理通用动态数组双端快速操作
reserve/capacity支持支持无(实现可能提供,但非标准保障)
典型使用场景字符串处理需要连续内存、顺序存储、高效尾操作的场合需要在两端频繁插入删除、又需随机访问的场合(如任务队列)
http://www.jsqmd.com/news/864389/

相关文章:

  • ParsecVDD终极指南:5分钟创建高性能虚拟显示器,解锁游戏串流新境界
  • 5个步骤让Windows视频播放体验升级:MPV_lazy懒人包完全指南
  • 江苏GEO优化公司实测榜单:TOP3 技术实力与效果数据全揭晓(2026 年 5 月最新) - GEO排行榜
  • 如何用5分钟完成淘宝25分钟任务:淘金币自动化完整指南
  • PowerToys中文汉化终极指南:让Windows效率工具真正为你所用
  • 2026山东青岛瓷砖空鼓翘边维修公司靠谱品牌排名:雨和虹防水维修/雨盛防水维修/秦鑫斌防水维修/森之澜漏水检测/能亿防水补漏/成诺防水修缮 - 雨和虹防水维修
  • 利用taotoken为开源项目提供可配置的多模型ai能力
  • 期刊论文重复率多少才算合格?
  • AI写标书主流工具实测,选对工具,比多写100页标书更重要
  • 多模型选型实验场景下Taotoken模型广场的价值与应用
  • 普通人从零起步,说服能力是底层核心硬技能
  • 英雄联盟玩家必备的3大效率神器:League Akari本地自动化工具完全指南
  • 3个问题+5大场景:Subtitle Edit如何成为你的免费字幕编辑神器?
  • 终极风扇控制指南:如何用FanControl彻底解决电脑散热噪音问题
  • AI安全实战:AI系统应急响应的实战演练案例
  • 2026年|别再盲目降AI率!知网AIGC检测从62%→5%,保姆级教程一次讲清 - 降AI实验室
  • Windows热键冲突终极指南:如何用Hotkey Detective快速定位“键盘小偷“
  • 2026国际课程辅导平台TOP3! - 品牌测评鉴赏家
  • 免费屏幕标注神器gInk:让你的演示和教学更加生动高效的完整指南
  • Zotero SciHub插件技术架构解析:TypeScript实现的学术文献PDF自动化下载方案
  • 知识主权、版本互证与算法殖民:论西方历史叙事的建构性谎言及其在现代大语言模型中的认知操纵
  • 2026中西医执医笔试好课排名,高效记忆课程优选 - 医考机构品牌测评专家
  • 2026年免费照片去水印软件排行榜:手机App与在线工具完全推荐指南
  • 如何在Windows上快速安装蔚蓝档案主题鼠标指针:完整指南
  • STM32F407VET6现货
  • 西方哲学价值审视与文明叙事反思 |Reflection on the Value of Western Philosophy and Civilization Narratives
  • 打造专属蔚蓝档案鼠标指针:3分钟让你的电脑桌面焕然一新
  • NormalMap-Online:浏览器内GPU加速的法线贴图生成解决方案
  • 如何免费实现百度网盘下载加速:BaiduPCS-Web完整使用指南
  • 如何利用ESP32-A2DP构建智能蓝牙音频系统:3大核心功能详解