掌握C++核心数据结构:从基础到实战的全面指南

数据结构(C++版)王红梅 第一章 绪论 逻辑结构可以分为 (1)线性结构 一对一 有且只有一个开始和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继 例如:线性表、栈、队列、串。 (2)非线性结构 一对多 一个结点可能也有多个直接前驱和直接后继 例如:树、图。 数据结构从逻辑上分为四类: (1)集合:数据元素之间就是“属于同一个集合” (2)线性结构:数据元素之间存在着一对一的线性关系 (3)树结构:数据元素之间存在着一对多的层次关系 (4)图结构:数据元素之间存在着多对多的任意关系。... 阅读详情

掌握C++核心数据结构:从基础到实战的全面指南

C++作为高性能编程语言的代表,其标准模板库(STL)提供了丰富的内置数据结构。本文将带您深入探索这些数据结构的特性、实现原理及最佳使用场景,助您写出更高效的C++代码。

一、数据结构选择矩阵

需求场景推荐数据结构时间复杂度优势
快速随机访问array/vectorO(1)访问
高频头尾操作deque/listO(1)插入删除
键值快速查找map/unordered_mapO(log n)/O(1)
自动排序set/multisetO(log n)操作
后进先出(LIFO)stack适配器模式
先进先出(FIFO)queue适配器模式

二、线性数据结构家族

1. 数组(array)

特性:固定大小的连续内存

#include <array>
array<int, 5> arr = {1,2,3,4,5}; // C++11

2. 动态数组(vector)

vector<double> prices;
prices.reserve(1000); // 预分配
prices.push_back(99.9);

3. 双端队列(deque)

deque<string> history;
history.push_front("page1");
history.push_back("page2");

4. 双向链表(list)

list<Employee> staff;
auto it = staff.begin();
advance(it, 2);         // O(n)访问
staff.insert(it, newHire); // O(1)插入

三、容器适配器

1. 栈(stack)

stack<Command> undoStack;
undoStack.push(copyAction);
undoStack.pop(); // LIFO

2. 队列(queue)

queue<PrintJob> printQueue;
printQueue.push(doc1);
printQueue.pop(); // FIFO

3. 优先队列(priority_queue)

priority_queue<int> maxHeap;
priority_queue<int, vector<int>, greater<int>> minHeap; 

四、关联容器

1. 有序集合(set/multiset)

set<string> dictionary;
dictionary.insert("algorithm");
if(dictionary.find("binary") != end()) {...}

2. 有序映射(map/multimap)

map<int, Student> roster;
roster[2023001] = Student("Alice");
auto it = roster.lower_bound(2023000);

3. 哈希容器(C++11)

unordered_map<string, int> wordCount;
wordCount.reserve(50000); // 预分配bucket
wordCount["the"] = 100;   // O(1)访问

五、树形结构实现

红黑树(底层实现)

// set/map的默认实现
template<class Key, class Compare = less<Key>>
class rb_tree {
    // 红黑树节点结构
    struct node {
        bool color;
        Key value;
        node *left, *right, *parent;
    };
    // 自动平衡插入算法
};

堆结构应用

// 使用vector模拟堆
vector<int> heap{10,5,8};
make_heap(heap.begin(), heap.end());
pop_heap(heap.begin(), heap.end());

六、高级数据结构技巧

1. 自定义比较器

struct CaseInsensitiveCompare {
    bool operator()(const string& a, const string& b) const {
        return lexicographical_compare(
            a.begin(), a.end(),
            b.begin(), b.end(),
            [](char c1, char c2) {
                return tolower(c1) < tolower(c2);
            });
    }
};

set<string, CaseInsensitiveCompare> uniqueWords;

2. 内存优化策略

// 使用deque分块存储
const int BLOCK_SIZE = 4096;
template<typename T>
class CustomVector {
    deque<array<T, BLOCK_SIZE>> blocks;
    // 实现类似vector接口
};

3. 数据结构的组合应用

// LRU缓存实现
class LRUCache {
    unordered_map<int, list<pair<int, int>>::iterator> cacheMap;
    list<pair<int, int>> accessOrder;
    int capacity;

    int get(int key) {
        auto it = cacheMap.find(key);
        if(it == cacheMap.end()) return -1;
        accessOrder.splice(accessOrder.begin(), accessOrder, it->second);
        return it->second->second;
    }
};

七、性能基准测试(单位:纳秒)

操作vector(10k)list(10k)deque(10k)
头部插入120,0008595
随机访问121,20035
尾部删除259040

测试环境:Intel i7-12700K, 32GB DDR5

八、选择数据结构的黄金法则

  1. 访问模式优先:随机访问选vector,顺序访问选list
  2. 内存考量:对缓存敏感选连续存储结构
  3. 稳定性需求:需要稳定迭代器时选择list/node-based结构
  4. 排序需求:自动排序用set/map,自定义排序需提供比较器
  5. 哈希优势:当O(1)访问比顺序更重要时选择unordered容器

九、C++20/23新特性展望

  • flat_map/flat_set:基于排序vector的实现(已进入C++23草案)
  • 静态vector:固定容量动态大小数组
  • 扩容策略定制:允许自定义vector的扩容系数
// C++23示例:flat_map
#include <flat_map>
flat_map<string, int> phoneBook;
phoneBook.insert("Emergency", 911);

总结

精通C++数据结构需要理解:

  • 各结构的底层实现原理
  • 时间复杂度与空间效率的平衡
  • 现代硬件架构的影响(缓存、预取)
  • 特定场景的最佳实践

“选择数据结构就是设计程序的核心架构” —— Niklaus Wirth

通过本文的系统梳理,希望您能建立起对C++数据结构的立体认知。在实际开发中,建议结合性能分析工具进行实测,找到最适合当前场景的数据结构解决方案。

C++中常用的数据结构 一直以来虽然写的都是C++的代码但是基本上用的都是C的数据结构。这次实现一个相对大型的C++项目,发现了很多很有用的数据结构,通过使用这些数据结构,可以极大程度的提高开发效率。所以计划逐渐整理下C++的数据结构,以及他们的用法,以供自己以及小白参考。暂时不涉及时间性能。 std::string std::vector std::vector<int> vec; std::vector<int> vec(3); // 深度为3的整形数据 std::vector<int> 阅读详情

相关推荐

C++程序架构

因为在程序中创建一个类的对象时,编译器只有在这个类的定义完全可见的情况下,才能知道这个类的对象应该如何布局,所以,关于类的 定义的要求,跟内联函数是基本一样的。这是可以的,也是很好的办法。注意一下,如果把函数成员的定义写在类定义的头文件中,而没有写进类定义中, 这是不合法的,因为这个函数成员此时就不是内联的了。考虑一下,如果有一个很常用的函数“void f() {}”,在整个程序中的许多.cpp文件中都会被调用,那么,我们就只需要在一个文件中定义这个函数,而在其他的文件中声明这个函数就可以了。

weixin_45295333的博客 1214

C++常用数据结构

常用数据结构 目录 1.线性表 定义: 特点: 1.1顺序表 定义: 特点: 实现: 基本操作: c语言版本: c++版本: 1.2链表 定义: 特点: 实现: 基本操作: 完整程序 c++版本...

火柴的初心的博客 1万+

从C++基础到算法竞赛:STL、数据结构与核心算法实战指南

在计算机编程领域,数据结构与算法是构建高效软件的核心基础,它们决定了程序的性能和资源效率。其原理在于通过合理组织数据与设计计算步骤,以最优方式解决问题。掌握这些技术对于开发高性能应用、通过技术面试至关重要,尤其在算法竞赛和大型系统开发中应用广泛。本文聚焦于C++标准模板库(STL)的实战应用,深入解析vector、map等关键容器,并结合二分查找、动态规划等核心算法思想,探讨如何将基础的C++知识转化为解决复杂问题的工程能力。通过理解STL特性和算法原理,开发者能显著提升代码效率与竞赛表现。

weixin_30521161的博客 424

C++——数据结构

前言 线性表(有序表)分为数组描述的线性表和链式描述的线性表。 数组和矩阵。 栈和队列。 跳表和散列。 二叉树和其他树。 优先级队列。 竞赛树和搜索树。 平衡搜索树。 图。 一、线性表——数组描述 (1)数组类型(通过模板类解决)和数组长度(动态数组解决)。 (2)动态数组,可以使用一个变量(非const值)从键盘上获取数组的长度: int n; printf("请输入数组的长度:"); scanf("%d",&n); int sz[n];//动态数组 (3)没有实现代码的成员函数称为纯虚函数;

摸鱼中...... 6416

OpenCV实战(2)——OpenCV核心数据结构

cv::Mat 类是用于保存图像(以及其他矩阵数据)的数据结构,该数据结构是所有 OpenCV 类和函数的核心,这是 OpenCV 库的一个关键元素,用于处理图像和矩阵(从计算和数学的角度来看,图像本质上是一个矩阵),同时 cv::Mat 数据结构结合了优雅的内存管理机制,因此,使用起来十分高效。本节中,我们介绍了 cv::Mat 结构的基本用法,并且深入探索了创建 cv::Mat 数据结构时的内存分配方式。

盼小辉丶的博客 9万+

C++高性能YAML解析库yaml-cpp实战指南

yaml-cpp允许通过模板特化扩展as<T>()功能,以支持自定义结构体或类的自动解析。假设我们有一个Person结构:int age;要使其能被直接转换,需特化模板:template<>Node node;if (!if (!if (!参数说明:encode:将C++对象序列化为YAML节点,用于输出;decode:从YAML节点反序列化为C++对象,返回false表示失败;decode。

weixin_42601702的博客 938

C++数据结构完全指南:从基础到高级的全面解析

本文全面解析C++数据结构,涵盖基础数组、结构体、类,到线性结构如动态数组和链表,以及特殊结构如栈和队列。通过代码示例详解实现与应用,帮助提升程序效率和可维护性,为编程打下坚实基础。

PyHaVolask的博客 1262

nature子刊:MCNN基于电池故障诊断的模型约束的深度学习方法

本研究提出了一种基于模型约束神经网络(MCNN)的锂离子电池在线故障诊断方法,整合物理模型与深度学习,有效解决了随机工况下传统方法诊断精度低、依赖故障样本等问题。通过统计修正电池包模型和双向LSTM网络,实现了电池状态的高精度预测(平均RMSE 3.9%),并设计模型耦合自动编码器提取可解释特征。在包含18.2百万条真实车辆数据的验证中,该方法故障检测TPR在FPR=0.1时达85%,较基准方法提升超46.5%,且能提前30分钟预警内部短路等故障。研究还展示了算法在跨电池包结构迁移中的优越性,为工业应用提供

hasakie的博客 1758

Redis 核心数据结构:String 类型深度解析与 C++ 实战

通过本文的深入探讨,我们全面地学习了 Redis String 类型的核心命令,并掌握了如何使用这一优秀的 C++ 库在实际项目中应用它们。我们从最基础的SET和GET出发,理解了借助带来的类型安全;我们学会了使用为键赋予生命周期,使其能够自动过期;我们探索了NX/XX选项在实现分布式锁等场景下的精妙用途;我们领略了MSET/MGET结合迭代器模式在批量操作中带来的巨大性能提升;我们还实践了对字符串的局部精细操作,以及INCR/DECR家族在构建高并发原子计数器时的核心价值。

2301_80863610的博客 9974

通讯软件002——快速使用modscan进行modbus调试

快速使用modscan进行modbus调试

zhouwl72的博客 1032

中国30米分辨率城市建成区数据集 (1972-2023年)

全国城市建成区空间分布数据(1972-2023年),利用Google Earth Engine平台,基于Landsat系列遥感影像提取了1972–2023年城市不透水面,后经过不透水面聚集密度计算方法计算了不透水面聚集密度,通过阈值划分提取了城市建成区,并设置了建成区面积阈值,去除了噪点,获取了全国城市建成区空间分布数据集。该提取能准确刻画城市形态,提取精度高,保持了建成区的完整性。数据集包括41期数据,1972年,1978年,1985-2023年逐年,分辨率为30米,有栅格和矢量两种格式。

地球资源数据云的官方博客 5824

RabbitMQ 入门:基于 AMQP-CPP 的 C++ 实践指南与二次封装

RabbitMQ 作为主流的消息中间件,凭借高可靠性、灵活的路由策略和跨语言支持,广泛应用于分布式系统解耦、异步通信场景。本文将以 C++ 的 AMQP-CPP 库为核心,从通信模式到核心接口,带你快速上手 RabbitMQ 的开发。AMQP-CPP 是 RabbitMQ 的 C++ 客户端库,提供两种网络通信模式,可根据项目的事件循环依赖灵活选择。TCP 模式需手动实现网络层逻辑,核心是继承类并完成关键函数重写,适合需要深度定制事件循环(如用 select/epoll)的场景。 2. 扩展模式:借助第三方

qq_34434522的博客 1332

​非线性分析-增加位移量可能出现下面错误。虽然求解无法在所有时间点完成,但在某些点上仍能够求解部分结果。请参阅“帮助系统”中的故障排除,以了解更多信息详情。由于受约束,规划求解引擎无法收敛

基于收敛状态拆分载荷步‌:在已收敛的载荷步基础上,将未收敛的关键区域拆分为更细的子步,比如在载荷突变点前设置5~10个子步,逐步加载。替换冲突约束为弱约束‌:若存在约束冲突,将刚性约束替换为弱弹簧约束(刚度设为1e-6~1e-4),既限制刚体位移,又不影响结构的变形自由度,命令流:SPRING, NODE, K, 1e-6。部分区域约束完整,但存在未被约束的刚体自由度,或约束类型与大变形/接触逻辑冲突,比如某部件的位移约束在初始阶段有效,但大变形后约束位置脱离实际受力点,导致求解器在该阶段无法收敛。

qq_15963745的博客 145

探索《CPP-17-STL-cookbook》:C++17 STL实战指南

是一个面向C++开发者的开源项目,由xiaoweiChen创建并维护。该项目旨在帮助开发者深入理解和充分利用C++17标准模板库(STL),以提升编程效率和代码质量。它提供了一系列实例教程,涵盖了STL的核心组件,包括容器、迭代器、算法和函数对象等。

gitblog_00055的博客 904

YOLOv8-Pose 姿态识别 RK3588 实战:从模型训练到 RKNN 部署,精度与推理速度双提升

本教程从YOLOv8-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

FJN110的博客 364

KylinOS 离线安装 MinIO【图文步骤】

在国产操作系统 KylinOS 中安装 MinIO,详细步骤...

甘蓝的专栏 1536

ChatAI-Cpp:Windows平台终极C++ AI聊天集成指南

还在为C++项目集成OpenAI API而头疼吗?复杂的HTTP请求、JSON解析、编码转换,这些繁琐的工作往往让人望而却步。现在,ChatAI-Cpp为你提供了完美的解决方案——一款专为MSVC优化的轻量级C++ OpenAI交互库,让你在十分钟内就能实现智能对话功能。 通过本文,你将掌握如何在Windows平台上快速部署ChatAI-Cpp,了解其核心架构设计,并学会解决实际开发中遇到的各种

gitblog_00827的博客 1007

实时数字人SoulX-FlashHead 音视频不对齐解决

【代码】实时数字人SoulX-FlashHead 音视频不对齐解决。

jacke121的专栏 201

探索json2cpp:将JSON文件编译为C++常量数据结构的利器

探索json2cpp:将JSON文件编译为C++常量数据结构的利器 项目介绍 在现代软件开发中,JSON作为一种轻量级的数据交换格式,广泛应用于配置文件、API响应等场景。然而,在C++项目中直接使用JSON文件通常需要运行时解析,这不仅增加了运行时开销,还可能带来潜在的安全风险。为了解决这一问题,json2cpp应运而生。json2cpp是一个开源项目,它能够将JSON文件编译为C++的stat...

gitblog_00003的博客 1038

C#上位机实战:工业产线数据采集与监控系统开发(附源码思路)

模块化设计:四层架构清晰,各模块独立可替换,便于后期维护与扩展;稳定性强:支持断线重连、异常重试、并发采集,满足工业7×24小时运行需求;实用性高:覆盖产线监控核心功能,可视化组件适配工业场景,操作简单;源码可复用:通信类、采集服务、报警管理器等可直接复制到其他上位机项目。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1654

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

免费让老Mac跑上最新macOS:OpenCore Legacy Patcher 上手指南

更新弹窗写着"此Mac不再支持",但你不想换机器。OpenCore Legacy Patcher(OCLP)通过引导层打补丁的方式,让苹果停更的Intel Mac继续安装并运行macOS Big Sur到Sequoia。代价是一块U盘、一次完整备份和约一小时的空闲时间。 [![OpenCore Legacy Patcher主菜单界面,提供构建OpenCore、创建macOS安装器、根补丁等入口]

gitblog_00808的博客 885

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

180个C++算法实战:如何系统化掌握数据结构核心技巧?

想要从零到一掌握C++算法与数据结构实战技巧?🤔 这个包含180+经典问题的开源项目正是你需要的系统化学习资源。通过精心编排的模块化设计,项目涵盖了从基础数据结构到高级算法的完整知识体系,为中级开发者提供了绝佳的C++算法实现参考和数据结构实战训练场。 [![C++算法学习成长路径](https://raw.gitcode.com/gh_mirrors/al/algorithms_and_da

gitblog_00905的博客 1103

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【C++基础回顾】基础入门和核心语法(万字详解!!!)

C++基本入门语法,包含引用、运算符重载、封装继承多态等知识,内含测试源码

2201_75475240的博客 982

C++ STL set 完全指南:从基础用法到实战技巧

本文全面介绍了C++ STL中的set容器,重点讲解了其自动排序、元素唯一等核心特性及底层红黑树实现。通过代码示例详细演示了set的初始化、插入、查找、删除等基础操作,并对比了multiset允许重复元素的特点。文章还展示了set在解决环形链表检测和数组交集问题中的实战应用,体现了set在数据去重和有序处理方面的优势。掌握set的使用能有效提升"去重+排序"场景的开发效率和代码可读性。

心向往之,行必能至 1211

【C++】JSON核心数据结构解析及JSONCPP使用

JSON是一种轻量级数据交换格式,基于键值对组织数据,支持字符串、数字、布尔值、null等基础类型,以及对象和数组两种复合结构。JSON对象是无序键值对集合,数组是有序值列表。实际应用中常组合使用对象和数组表示复杂数据,如列表型数据和多层级结构。JSON语法严格,要求键必须用双引号、末尾不能有多余逗号。JsonCpp是C++的JSON处理库,核心类Json::Value可表示所有JSON数据类型,通过类型枚举区分不同结构。JSON广泛应用于前后端交互和数据存储,是跨平台数据交换的首选格式。

Ape's IT Blog 1052

JSON到C++静态常量数据结构的编译器:json2cpp

JSON到C++静态常量数据结构的编译器:json2cpp json2cpp 是一个开源项目,它可以将 JSON 文件编译成静态常量(constexpr)数据结构,以便在编译时或运行时使用。该项目主要使用 C++ 编程语言,同时依赖于 CMake 进行构建。 项目基础介绍 json2cpp 的目的是为开发者提供一个高效的工具,用于将 JSON 数据直接嵌入到 C++ 程序中,从而避免运行时解析 J...

gitblog_00708的博客 614
上一篇: 深入理解C++ vector容器:动态数组的终极指南
下一篇: C++指针的详解 - 看完你就懂了
code19980507
博客等级 码龄2年 318粉丝 35原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值