C++学习系列(10):STL 容器底层原理

C++ STL底层实现 STL以及底层实现学习记录 阅读详情

C++学习系列(10):STL 容器底层原理

1. 引言

STL(Standard Template Library,标准模板库) 是 C++ 最重要的组成部分之一,其中 容器(Container) 提供了丰富的数据结构支持,如 vector、list、map、set 等。

本篇博客将介绍:

  • STL 容器的基本概念
  • 不同 STL 容器的底层实现
  • STL 容器的性能对比
  • 常见的 STL 容器使用技巧

2. STL 容器概览

STL 容器可分为以下几类:

容器类型示例底层结构特点
顺序容器vector、deque、list动态数组 / 双向链表适用于存储有序数据
关联容器map、set、multimap红黑树(RB-Tree)适用于快速查找和排序
无序容器unordered_map、unordered_set哈希表(Hash Table)适用于快速查找,但无序

3. vector 底层实现

3.1 vector 的基本特性

✅ 动态数组:内存连续,支持随机访问
✅ 自动扩容:超过容量时,vector 会 重新分配更大的内存,并拷贝数据
✅ 扩容倍数:通常是 1.5 - 2 倍

3.2 vector 的底层结构

template <typename T>
class vector {
private:
    T* data;   // 指向存储数组
    size_t size;   // 当前元素个数
    size_t capacity;   // 总容量
public:
    void push_back(const T& value);  // 添加元素
    void pop_back();   // 删除最后一个元素
    T& operator[](size_t index);   // 访问元素
};

3.3 vector 的自动扩容

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec;
    for (int i = 0; i < 10; ++i) {
        vec.push_back(i);
        std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;
    }
    return 0;
}

📌 解析

  • size() 返回当前元素个数
  • capacity() 返回当前分配的空间

4. list 底层实现

4.1 list 的基本特性

✅ 双向链表:每个节点存储 前后指针
✅ 插入、删除高效:O(1) 复杂度,但 不支持随机访问

4.2 list 的底层结构

template <typename T>
class ListNode {
public:
    T value;
    ListNode* prev;
    ListNode* next;
};

4.3 list 的插入删除

#include <iostream>
#include <list>

int main() {
    std::list<int> lst = {1, 2, 3};
    lst.push_front(0);
    lst.push_back(4);

    for (int x : lst) {
        std::cout << x << " ";
    }
    return 0;
}

📌 解析

  • push_front() 插入头部
  • push_back() 插入尾部
  • list 不支持 随机访问(operator[])

5. map 和 set(红黑树)

5.1 map 和 set 的底层实现

✅ 红黑树(RB-Tree) 作为底层数据结构
✅ 自动排序,插入数据时 按键值排序
✅ 查找复杂度 O(log N)

5.2 map 的基本操作

#include <iostream>
#include <map>

int main() {
    std::map<int, std::string> mp;
    mp[1] = "Apple";
    mp[2] = "Banana";

    for (const auto& [key, value] : mp) {
        std::cout << key << ": " << value << std::endl;
    }
    return 0;
}

📌 解析

  • map 自动按 key 排序,不需要手动排序

6. unordered_map(哈希表)

6.1 unordered_map 的底层实现

✅ 哈希表(Hash Table)
✅ 查找效率 O(1),比 map 快
✅ 无序存储

6.2 unordered_map 的使用

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> umap;
    umap["apple"] = 5;
    umap["banana"] = 10;

    for (const auto& [key, value] : umap) {
        std::cout << key << ": " << value << std::endl;
    }
    return 0;
}

📌 适用于

  • 需要 快速查找
  • 对数据 顺序没有要求

7. STL 容器性能对比

容器结构插入性能访问性能适用场景
vector动态数组O(1)(尾部插入)O(1)(随机访问)适用于 大量读写,不频繁插入
list双向链表O(1)(头尾插入)O(n)(遍历)适用于 频繁插入删除
map红黑树O(log N)O(log N)有序存储,快速查找
unordered_map哈希表O(1)O(1)最快的查找方式,无序存储

8. 总结

✅ vector 适用于 随机访问,但 插入删除慢
✅ list 适用于 频繁插入删除,但 访问慢
✅ map 适用于 有序存储,查找 O(log N)
✅ unordered_map 适用于 无序存储,查找 O(1)

下一篇 C++学习系列(11),我们将探讨 C++ 智能指针 unique_ptr、shared_ptr 和 weak_ptr,敬请期待!🚀


💡 如果你喜欢这篇文章,欢迎点赞、收藏,并关注本系列!

Win10下Delphi 10.4.2 (RAD Studio 10.4.2 )安装教程图解 Win10下Delphi 10.4.2 (RAD Studio 10.4.2 )安装和破解教程图解 阅读详情

相关推荐

IEC 62056协议栈深度拆解:从物理层握手到应用层AARQ,一次完整的DLMS通讯抓包分析

本文深入解析IEC 62056协议栈(DLMS/COSEM)的全流程通信机制,从物理层握手到应用层AARQ建立,提供详细的抓包分析和实战指南。涵盖RS-485配置、HDLC帧解析、OBIS编码解读等核心内容,并附有常见故障排查技巧,助力开发者高效实现电能表数据采集。

weixin_29182481的博客 312

C++ STL容器底层详解

转载自:C++STL的容器的底层实现详解 文章目录顺序容器vector(向量容器)deque(双端队列)liststackqueuepriority_queue关联式容器setmultisethash_setmap(key,value)multimaphashtablehash_mapunordered_mapmap、hash_map、unordered_map比较 顺序容器 vector(向量容器) 特点 内存可2倍增长的动态数组 数据结构:线性连续空间 三个迭代器:start、finish、end_o

qq_40156159的博客 4101

批量导入经纬度点到奥维地图中

随便说说 最近出来出差,天天东奔西跑的,跑完了回到酒店还得整理一天的成果,基本上晚上9点才能整理完,累的基本上倒头就睡,没时间鼓捣自己喜欢的东西了。但想着也得写点啥吧,想来想去就那最近工作中用到的东西吧。因为我们现在的工作内容呢,基本上就是按照着上面给的地理位置找到地方开始检查。所以呢,就需要批量的把手上的经纬点信息导入到地图中,安排好路线,利用导航高效的找到地方。给的坐标就是gps点,wgs-84的,使用奥维地图最方便了,不用做坐标转换直接能用。所以作为组里的gis担(苦)当(力),这个导坐标的活就由我来

lionhenryzxxy的博客 3万+

STL剖析(二):容器底层数据结构及常见用法

本文主要聚焦于STL容器,下文将逐一对各个容器底层的数据结构以及常见用法进行介绍。

LW的技术小筑 1293

「分治法」最近点对距离问题

一、问题描述 给定平面S上n个点,找其中的一对点,使得在n个点组成的 所有点对中,该点对间的距离最小。 假设所讨论的点是以标准笛卡儿坐标形式(x, y)给出的。因 此,在两个点Pi =(xi , yi )和Pj =(xj , yj )之间的距离是标准的欧几里德 距离: d = 根号下( x i − x j ) 2 + ( y i − y j )2 二、问题分析 直接用暴力解法很简单,用结构体把每个点的x、y坐标都存下来之后,用一个二重循环即可获得距离的最大值。但是这样做的时间复杂度也达到了O(n的平方)

Laok0413的博客 9656

保姆级教程:在Ubuntu 22.04上搞定PX4 V1.14 + ROS2 Humble的HITL仿真(避坑实录)

本文提供在Ubuntu 22.04上配置PX4 V1.14与ROS2 Humble的HITL仿真环境的详细教程,涵盖环境准备、固件编译、QGroundControl配置、ROS2通信设置及联调测试。特别针对版本兼容性、Gazebo插件构建和MicroDDS配置等常见问题提供避坑指南,帮助开发者高效搭建无人机仿真系统。

weixin_30836759的博客 1004

C++ STL容器底层学习(个人总结)

C++ STL容器底层学习(个人总结)

q473203506的博客 1326

IAR9.20.4安装与注册全攻略:附资源及典型问题解决方案

本文提供IAR9.20.4的详细安装与注册指南,涵盖环境准备、安装步骤、权限设置及注册机使用技巧。针对典型问题如评估版残留、权限不足和杀毒软件拦截等,给出了具体解决方案,帮助用户顺利完成IAR开发环境的搭建与激活。

a2b3c4d5e的博客 296

关于C++STL的总结(基础使用)

C++ STL六大组件大致总结

m0_62126248的博客 1951

SOLIDWORKS2024安装卡顿?Edge WebView2 Runtime冲突的排查与修复

本文针对SOLIDWORKS 2024安装时setup.exe无响应或卡死的常见问题,深入剖析了其根本原因在于Microsoft Edge WebView2 Runtime的版本冲突或组件损坏。文章提供了三种经过验证的解决方案:一是通过运行安装包内swwi\data目录下的setup.exe直接绕过图形界面;二是彻底卸载并重装官方Edge WebView2 Runtime组件;三是进行系统级修复与排查。旨在帮助用户快速定位并解决安装障碍,顺利完成软件部署。

4k5l6j7h8的博客 289

【QNX+Android虚拟化方案】129 - USB眼图参数配置

【QNX+Android虚拟化方案】129 - USB眼图参数配置

|~~~热爱生活、努力学习的小伙汁~~~| 821

详解C++STL容器系列(一)—— vector的详细用法和底层原理

目录一、介绍二、vector的创建和方法创建vector方法三、vector的具体用法3.1 遍历vector3.1.1 迭代器访问3.1.2 下标访问3.1.3 范围for循环3.2 vector 容量和大小3.3 vector 常用算法3.3.1 push_back、pop_back 和 emplace_back3.3.2 insert 和 emplace3.3.3 erase3.3.4 assign3.3.5 swap 和 clear3.4 vector二维操作定义访问resize操作四、vector

aruewds的博客 5万+

【YOLOv8科研级优化】基于YOLOv9的GELAN模块重构C2f结构,实现精度与效率的同步提升

打开确保模型解析器能识别GELANBlock模块。通过将YOLOv9的GELAN模块集成到YOLOv8的C2f模块中,我们实现了一个“强特征表达+高效计算”的目标检测模型。这个改进不仅在工程上能提升复杂场景下的检测效果,更在科研上提供了“多分支特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的改进中,帮你在论文中打造独特的研究点。

know_F0727的博客 203

C++ STL容器底层实现原理

1、vector 容器 vector 的数据安排以及操作方式,与 array 非常相似。两者的唯一区别在于空间的运用的灵活性。array 是静态空间,一旦配置了就不能改变,vector 是动态数组。在堆上分配空间。vector 是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素(有保留内存,如果减少大小后内存也不会释放。如果新值&gt;当前大小时才会再分配内存,这大大影响了 vec...

C/C++ farer的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++STL容器系列(三)list的详细用法和底层实现

c++ STL中的 list详细使用介绍、用法详解及底层实现

You build it, you run it 5171

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++ STL学习之【容器适配器】

适配器(配接器)是STL中的六大组件之一,扮演着轴承、转换器的角色,使得STL中组件的使用更为灵活,比如栈和队列就是属于适配器而非容器,以及神秘的反向迭代器也属于适配器

北 海的博客 5374

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C++ STL 几个容器的底层实现

C++ STL 的实现: 1.vector 底层数据结构为数组 ,支持快速随机访问 2.list 底层数据结构为双向链表,支持快速增删 3.deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问 deque是一个双端队列(double-ended queue),也是在堆中保存内容的.它的保存形式如下: [堆1] -->[堆2] --&gt...

大隐隐于野 1873

C++ STL 容器深入剖析:vector、list、map 等的底层实现

容器类型随机访问插入(中间)删除(中间)插入(末尾)删除(末尾)查找vectorO(1)O(n)O(n)O (1)(均摊)O(1)O(n)listO(n)O(1)O(1)O(1)O(1)O(n)mapO(log n)O(log n)O(log n)O(log n)O(log n)O(log n)O (1)(平均)O (1)(平均)O (1)(平均)O (1)(平均)dequeO(1)O(n)O(n)O(1)O(1)O(n)

数字魔方操控师的博客 1122

STL容器原理解析:从vector到map的底层实现

STL容器是C++标准库的核心组件,主要分为序列容器(vector、list等)、关联容器(map、set等)和容器适配器(stack、queue等)。vector采用动态数组实现,支持快速随机访问但中间操作效率低;map基于红黑树实现,提供有序存储和高效查找;unordered_map使用哈希表实现,查找性能更优但无序。不同容器在时间复杂度上各有优劣:vector随机访问O(1),map查找O(log n),unordered_map平均O(1)。选择容器应考虑访问模式(随机/顺序)、操作频率(插入/查找

qq2745567641的博客 1084

C++ 第二阶段 模板编程 - 第三节:STL容器与算法的底层原理

STL(标准模板库)是C++泛型编程的核心框架,通过容器、迭代器、算法等组件实现高效的数据管理与操作。其容器包括序列容器(如vector、deque、list)和关联容器(如map、unordered_map),各有不同的底层实现(连续内存、链表、红黑树等)和性能特点。算法通过迭代器与容器解耦,支持排序、查找等通用操作,并可结合函数对象定制行为。优化策略包括内存预分配、编译期内联等。最佳实践建议根据场景选择合适容器,优先使用标准组件,并关注性能与异常安全。STL的设计体现了代码复用性与灵活性的平衡。

弘羽 2227

【C++】C++ STL的神秘面纱:探寻底层原理

理解 STL 的底层原理,对于我们在 C++ 编程中有着诸多帮助 。它能让我们根据具体的应用场景,更加准确地选择合适的容器和算法,从而提高程序的性能和效率 。在处理大量数据且需要频繁随机访问时,选择vector容器和sort算法会是一个不错的选择;而在需要频繁插入和删除操作时,list容器则更为合适 。深入了解底层原理还能帮助我们更好地调试和优化代码,避免一些常见的错误和陷阱,迭代器失效问题 。

大雨淅淅的博客 1233

C++ 常用STL底层原理

map,set,list,deque,vector,queue,stack

q3415597181的博客 1114

C++ STL容器底层数据结构总结

STL 就是所谓的标准模板库(Standard Template Library),这可能是C++程序员的一大利器。 总的来说,STL包括几个部分:容器,算法(泛型算法),迭代器三个主要部分(当然还包含仿函数,适配器等其他部分),下图说明了三个主要部分之间的关系(网图,侵删)。 要是详细的总结,这肯定是一本类似于《C++ Primer》的大书。本篇文章主要是对于STL中的常用容器的底层数据结构...

Jiewang的博客 1664

探索实现C++ STL容器:从原理到定制

/ ... };自定义容器需实现符合标准的迭代器,确保与算法兼容。是否需要有序:是→map/set;否→unordered_map/flat_map插入删除位置:尾部→vector;头部/中部→deque/list;任意→list内存限制:严格→flat_set;宽松→unordered_set并发需求:是→ConcurrentQueue;否→标准容器。

zqmgx13291的博客 988

C++ STL set 系列完全指南:底层原理、核心接口与实战场景

C++ STL中的set系列容器是关联容器的核心成员,包含set、multiset、unordered_set和unordered_multiset。其核心差异在于底层实现:有序容器(set/multiset)基于红黑树实现,保证O(logn)操作时间并自动排序;无序容器(unordered_set/unordered_multiset)基于哈希表实现,提供平均O(1)的快速访问但无序。本文深入解析了四大容器的底层原理(红黑树的自平衡特性与哈希表的哈希冲突处理)、核心接口(构造、迭代器、增删查改操作)以及各

从零开始,掌握网络安全。提供全面的网络安全教程、攻防演练技巧和行业动态。 1210

C++ STL list容器底层实现(详解版)

前面在讲 STL list 容器时提到,该容器的底层是用双向链表实现的,甚至一些 STL 版本中(比如 SGI STL),list 容器的底层实现使用的是双向循环链表。 图 1 双向链表( a) )和双向循环链表( b) ) 图 1 中,node 表示链表的头指针。 如图 1 所示,使用链表存储数据,并不会将它们存储到一整块连续的内存空间中。恰恰相反,各元素占用的存储空间(又称为节点)是独立的、分散的,它们之间的线性关系通过指针(图 1 以箭头表示)来维持。 list 容器节点结构 通过图 1 可以看到,

白小飞 3128
上一篇: C++学习系列(9):多线程编程基础
下一篇: C++学习系列(11):智能指针(unique_ptr、shared_ptr、weak_ptr)
DoYangTan
博客等级 码龄5年 1946粉丝 319原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值