c++常用数据结构

C++语言的数据结构 数据结构是计算机科学的基础,掌握常用数据结构的特性、操作及应用,能够帮助程序员提高代码的效率和可读性。在C++中,数组、链表、栈、队列、树、图等数据结构各有其独特的用途和实现方式。理解这些数据结构及其应用场景对于编写高效的程序至关重要。在实际开发中,选择合适的数据结构可以显著提高程序的性能和可维护性,因此在设计系统架构时应充分考虑数据结构的选用。希望本文能够帮助读者加深对C++数据结构的理解,并在以后的编程实践中有所应用。 阅读详情

数组
在这里插入图片描述

静态数组
运行期间无法改变数组大小,由编译期间确定,C++中array即此类

int main ()
{
    array<int, 10> a = {0,1,2,3,4,5,6,7,8,9};
    a[0] = 22;
    cout<<a.at(0)<<endl;
    cout<<a.back()<<endl;

    return 0;
}

动态数组:C++中有两个,分别是vector和deque
vector
矢量,只能在末尾增删元素

数组大小增长策略:每次增加长度为原来1倍(有些编译器增加0.5倍)

这样可保证追加元素的平均时间复杂度为O(1)

int main ()
{
    vector<int> vv = {1,2,3,4};
    vv.push_back(12);// 在末尾添加元素
    vv.pop_back();// 在末尾删除元素
    vv.at(3);// 读取第三个元素
    vv[3];// 读写第三个元素
    vv.insert(vv.begin()+3, 12);// 将元素插到第三个位置上
    
    return 0;
}

priority_queue
优先队列,默认由 vector 实现,也可由 deque 实现。它保证顶部元素始终是最大值,可用于实现堆排序。

int main ()
{
    priority_queue<int> pp;
    pp.push(12);
    pp.push(10);
    pp.push(11);
    pp.top();// 读取顶部元素
    pp.pop();// 弹出顶部元素
    
    return 0;
}

deque
双端队列,可在开头或末尾增删元素

int main ()
{
    deque<int> dd;
    dd.push_front(12);// 在开头添加元素
    dd.push_back(10);// 在结尾添加元素
    dd.insert(dd.begin()+1, 3);// 在位置1插入元素
    dd.front();// 读取开头元素
    dd.back();// 读取结尾元素
    dd[1]; // 读取第一个元素
    dd.pop_front();// 弹出开头元素
    dd.pop_back();// 弹出末尾元素

    return 0;
}

stack
栈,默认由 deque 实现,也可由 list 或 vector 实现。是一种先进后出的数据结构

int main ()
{
    stack<int> ss;
    ss.push(12);// 添加元素
    ss.top();// 读取栈顶元素
    ss.pop();// 弹出栈顶元素

    return 0;
}

queue
队列,默认由 deque实现,也可由 list 实现。是一种先进先出的数据结构

int main ()
{
    queue<int> qq;
    qq.push(12);// 添加元素
    qq.front();// 读取队首元素
    qq.pop();// 弹出队首元素

    return 0;
}

单向链表
在这里插入图片描述

forward_list
只能从头到尾顺序遍历,不能逆序遍历,即没有 rbegin() 接口

int main ()
{
    forward_list<int> fl;
    fl.push_front(12);// 在开头添加元素
    fl.insert_after(fl.begin(), 11);
    fl.pop_front();// 在开头删除元素
    fl.remove(11);// 删除元素

    return 0;
}

双向链表
在这里插入图片描述

int main ()
{
    list<int> ll;
    ll.push_back(12);// 在末尾添加元素
    ll.push_front(10);// 在开头添加元素
    ll.back();// 读取末尾元素
    ll.front();// 读取开头元素
    ll.push_back(12);
    ll.unique();// 删除重复元素
    cout<<ll.size()<<endl;
    ll.pop_front();// 在末尾删除元素
    ll.pop_back();// 在开头删除元素

    return 0;
}

在这里插入图片描述
常见的树有二叉树、二叉搜索树、二叉平衡树、红黑树等。

C++ 中的 set multiset map multimap 是用二叉搜索树实现的,这种数据结构支持二分搜索,所以增删改查的复杂度都是O(logn)。

set
类似数学中的集合,set 中不能包含重复的元素,元素是排好序的,且不能被修改。

int main ()
{
    set<int, less<int>> ss;// 由小到大排序
    ss.insert(12);
    ss.insert(10);
    for(auto itr=ss.cbegin(); itr!=ss.cend(); itr++)cout<<*itr<<endl;// 输出 10 12
    ss.erase(ss.cbegin());// 擦除首元素
    ss.count(13);// 元素 13 的个数,0 或 1
    ss.find(10);// 查找元素 12,返回迭代器,若没找到返回 ss.end()

    return 0;
}

multiset
与 set 类似,但可以包含重复元素

int main ()
{
    multiset<int, less<int>> ms;// 由小到大排序
    ms.insert(12);
    ms.insert(10);
    ms.insert(10);
    for(auto itr=ms.cbegin(); itr!=ms.cend(); itr++)cout<<*itr<<endl;// 输出 10 10 12
    cout<<""<<endl;
    auto pp = ms.equal_range(10);
    for(auto itr=pp.first; itr!=pp.second; itr++)cout<<*itr<<endl;// 输出 10 10
    ms.lower_bound(10);// = pp.first
    ms.upper_bound(10);// = pp.second

    return 0;
}

map

int main ()
{
    map<int, int> mm;
    mm[1] = 1;// 插入元素 (1,1)
    mm.insert(make_pair(2,2));// 插入元素 (2,2)
    for(auto itr=mm.cbegin(); itr!=mm.cend(); itr++)
        cout<<"("<<itr->first<<","<<itr->second<<")"<<endl;// 输出 (1,1) (2,2)

    return 0;
}

multimap

int main ()
{
    multimap<int, int> mm;
    mm.insert(make_pair(1,10));// 插入元素 (1,10)
    mm.insert(make_pair(1,11));// 插入元素 (1,11)
    mm.insert(make_pair(2,2));// 插入元素 (2,2)
    for(auto itr=mm.cbegin(); itr!=mm.cend(); itr++)// 遍历所有元素
        cout<<"("<<itr->first<<","<<itr->second<<")"<<endl;// 输出 (1,10) (1,11) (2,2)
    for(auto itr=mm.lower_bound(1); itr!=mm.upper_bound(1); itr++)// 遍历 key=1 的元素
        cout<<"("<<itr->first<<","<<itr->second<<")"<<endl;// 输出 (1,10) (1,11)
    mm.erase(1);// 删除所有 key=1 的元素
    mm.erase(mm.cbegin());// 删除第一个元素

    return 0;
}

映射
在这里插入图片描述

映射类似数学中的函数,每一个 key 对应一个 value,写成函数表达式为:value=f(key),其中 f 被称为哈希函数。

C++11 中的 unordered_set unordered_multiset unordered_map unordered_multimap 是用映射实现的,这种数据结构可以在O(1)的时间复杂度下访问单个元素,效率高于二叉搜索树(O(logn)),但是遍历元素的效率比二叉搜索树低。

unordered_set
接口与 set 类似,不在赘述

unordered_multiset
接口与 multiset 类似,不在赘述

unordered_map
接口与 map 类似,不在赘述

unordered_multimap
接口与 multimap 类似

C++常用数据结构总结 前言 所有的容器归根到底都是内存空间的排列方式和在空间上施加各种各种不同的限制所得的。空间排列方式只有线性和链式两种方式,链式是通过记录每一个数据的地址来实现查找下一位数据的。而每一个容器所具有的特性就决定了它所适用的情况,总的来看容器常用的无非是增删改查操作,下面将从适用场景、常用操作来进行总结。 array数组 内存空间为连续的一段地址,适用于提前已知所要存储的数据类型和数量、进行大量... 阅读详情

相关推荐

C++中常用的数据结构

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

菜鸟乱学 4695

C++常用数据结构

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

火柴的初心的博客 1万+

C++ STL中常用数据结构

C++ STL常用数据结构

乘风破浪Now 的博客 1348

【五一创作】c++七种常用数据结构

c++七种常用数据结构

Runcode8的博客 3953

几个常用的数据结构

几个常用的数据结构封装,Vector List HashSet HashMap Queue

飞傲Fiio+foobar2000 实现dsd解码+灯正常显示

飞傲Fiio+foobar2000 实现dsd解码+灯正常显示。安装后可将DSD格式的数据通过ASIO驱动传输至DAC。安装后可识别DAC的ASIO驱动。安装后可识别DSD文件。

yanlei7993的博客 2303

C++几种常见的数据结构

由于vector是顺序存储结构,所以如果发生了扩容,需要重新申请一块更大的连续内存空间,并将原数据复制过去,所以存储地址有可能发生变化。顺序表相邻(逻辑地址相邻)的两个节点,在内存中具有相邻的物理地址。线性表存储的数据是依次排列的,具有一对一的相连方式。链表相邻(逻辑地址相邻)的两个节点,在内存中的物理地址不一定相同。的对应关系的数据存储结构。如下图所示是我们比较常用的二叉树结构,二叉树具有1对2的对应关系。栈和队列是特殊的线性表,因为他们对数据的进出顺序做出了明确的要求。的对应关系的数据存储结构。...

ymhdt的博客 9766

PAM4信号测试实战:从眼图分析到误码率测量的技术演进

在高速数字系统设计中,信号完整性测试是确保数据传输可靠性的核心环节。其基本原理在于通过时域和频域分析,精确评估信号在传输过程中的质量衰减与失真。随着数据速率向56Gbps及以上演进,传统的NRZ编码面临带宽瓶颈,而PAM4调制技术通过在每个符号周期内承载更多比特信息,成为提升信道效率的关键路径。这项技术的工程价值在于,它允许在相同带宽下实现翻倍的数据吞吐量,这对于数据中心互联、PCIe 6.0及800G以太网等高速接口至关重要。然而,PAM4信号电平间距更小,对噪声和抖动极为敏感,导致其原始误码率显著升高,

weixin_42522817的博客 657

常用数据结构总结(基于C++)

目录 栈(stack) 简介 声明 基本操作 代码示例 队列(queue) 简介 声明 基本操作 代码示例 优先队列(priority_queue) 简介 声明 基本操作 调整输出次序 二叉搜索树 简介 基本概念 C++的STL中基于二叉搜索树有数据结构set和map 1.set 常用操作 2.map 声明 常用...

li_il的博客 1040

MOSFET热失效机理与保护电路设计:实战案例

深入解析MOSFET工作原理及其在高温下的失效机制,结合实际案例探讨有效保护电路设计,提升系统可靠性与安全性。

weixin_28713083的博客 851

PLC作为Modbus TCP客户端

PLC作为Modbus TCP客户端,Modbus Slave作为服务器

soledad_chao的博客 4379

C++中有哪些常用的数据结构或算法

C++中常用的数据结构和算法非常丰富,它们为高效的数据管理和处理提供了强有力的支持。

chengxuyuan1213_的博客 944

Ollama+FAISS+Embedding+Rerank+LLM 详细部署指南

下载安装Ollama 双击运行安装程序 安装完成后会自动启动服务 修改默认安装路径(避免C盘爆满) 或使用PowerShell: 验证安装 Linux系统部署: (二)准备模型 1. 拉取Embedding模型 2. 拉取LLM模型 注意:原文中提到的可能需要从自定义仓库拉取: 3. 下载Rerank模型 (三)安装依赖库 创建项目目录和虚拟环境: 二、主要功能实现 项目结构 (一)配置文件(config/config.yaml) (二)文本分块策略实现 创建 : (三)文档读取

AI技术改变世界 1582

C++STL常用数据结构

众所周知,栈、队列、优先级队列都是比较常用的数据结构,但是手写又太麻烦,怎么办?用STL标准库呗!

起床气233的博客 1282

前端使用二开Thingsboard一、二、三事(四)-部件库

以项目实战为基础,逐步介绍前端在thingsboard系统二次开发中的一些注意事项以及一些thingsboard一些页面功能讲解,为前端人员开发使用thingsboard提供一种可靠思路,打造一个完美的物联网系统。

weixin_43163457的博客 742

【一看就会】Autoware.universe的“规划”部分源码梳理【0】——Planning综述(持续更新中)

单独开一篇planning综述,作为整个规划系列的开篇。本篇综述会持续更新,希望能帮助大家更好的整体理解规划部分。这个部分会持续更新。

weixin_48386130的博客 1966

C++有哪些常用的数据结构和算法?

C++提供了丰富的数据结构和算法,这些是编程中的重要工具。

2401_82816536的博客 883

YOLO26 多任务统一架构:检测 / 分割 / 姿态 / OBB 设计

YOLO26提出了一种多任务统一架构,整合了目标检测、实例分割、姿态估计和旋转框检测(OBB)四大计算机视觉任务。该架构采用共享Backbone和Neck的设计,配合轻量级任务特定Head,解决了传统方法中多模型并行带来的高开发成本、大内存占用和低推理效率问题。核心设计包括:1)共享特征提取层实现参数复用;2)模块化Head结构支持灵活任务组合;3)统一接口实现单模型多任务处理。实验表明,该架构在保持各任务性能的同时显著提升了系统效率,为多任务视觉系统提供了新的实现范式。

一键难忘的博客 706

C++ 常用数据结构详解:从基础到高级应用

数据结构是程序设计的核心,C++ 提供了丰富的数据结构支持。本文将系统讲解 C++ 中 12 种常用数据结构,涵盖基础类型、标准库容器和自定义实现,通过详细代码示例展示其用法和特性。

suwuzs的博客 1260

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

cpp刷题常用数据结构

数组 vector 初始化 vector<int> nums={1,2,3}; vector<int> nums={}; vector<int> nums(n,m); // 长度是 n,默认值是 m,如果不给默认值,则默认值是0 vector<vector<int>> dp(n,vector<int>(m,0)); 一个 n 行 m 列二维数组,默认值是0 曾删改查,遍历,大小,是否为空 nums.insert(nums.begin(

LittleConner的博客 646

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++STL常用数据结构汇总

介绍了c++STL常用数据结构及例子

专注后端应用开发领域优质创作者 713

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

c++数据结构与算法(常用算法)

数据结构与算法总结

qq_45686408的博客 525

C++语言基础——常用数据结构及其API

本文基于https://labuladong.online/algo/programming-language-basic/cpp/并进行了补充。

KalutSirocco的博客 921
上一篇: error C2371: “Dt_RECORD_HighLowBeamInfos_FC”: 重定义;不同的基类型
下一篇: size_t类型
YL_python_C++_java
博客等级 码龄7年 1392粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值