学好这 13 种数据结构,应对各种编程语言(C++ 版)

数据结构c语言版严蔚敏第二版课后答案 数据结构c语言版第二版课后答案严蔚敏 1.自学编程,难免思路阻塞,收集更新了严蔚敏,吴伟民版《数据结构-C语言版》各章节的课本源码和配套习题集答案解析,目的是为了整理数据结构中的知识点,并与网友交流意见,集思广益,共同进步。这里是所有的源码和课后习题实现目录: 这些源码和答案还有 数据结构 严蔚敏(c语言)第二版PDF书籍 下载地址在文章最下方: 02.本源码与解析涵盖了《数据结构》课本和习题集... 阅读详情

学了这么长时间数据结构和算法,有必要来个总结了,顺便回顾一下我们这段时间的学习成果。以 C++ 语言本身提供的数据结构为例。如果能掌握这 13 种数据结构,相信在学习其它语言的时候就不费劲了。 

数组 Array 

数组在初始化的时候就需要知道其大小,后续是不可以改变其大小的,可以通过下标来获取某个 index 中存放的元素。在 C++ 中通过源码可以知道,它其实是在 C 数组的基础上封装的: 

 

#include <array>

void testArray() {

// 创建一个数组

std::array<int, 5> a = {2, 4, 6, 8, 10};

// 对数组进行遍历

for (const auto i : a) {

std::cout << i << std::endl;

}

for(int i = 0; i < a.size(); i++) {

std::cout << a[i] << std::endl;

}

// 取第一个值,通过 [index] 获取

std::cout << "a[0] = " << a[0] << std::endl;

// 修改数组中第一个值

a[0] = 5;

/**

at 会检查 index 是否越界,越界将 crash,而 a[index] 不会;

libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: array::at

*/

a.at(0);

// 数组是否为空

a.empty();

// 求数组的长度

std::cout << "a.size()=" << a.size() << std::endl;

// 获取第4个值

int value = std::get<4>(a);

std::cout << "a(4) = " << value << std::endl;

// 创建一个空数组,数组中的值为0或者是与类型相等的其它值

std::array<int, 5> a2;

std::cout << "end a2" << a2[0] << std::endl;

// 比较两个数组中的元素是否都相等

if (a == a2) {}

}

可变数组,向量vector

在C++中使用 Vector 存当可变数组,它的容量可以动态改变,初始化的时候不需要确定数组的大小。使用的方法和数组基本一致。

 

#include <vector>

// 向量

void testVector() {

/**

vector<T> 它与Array不同,它的大小是可变的

*/

std::vector<std::string> v;

// 增加容器的容量,至少容纳 20 个元素

v.reserve(20);

// 初始化一个向量

std::vector<int> v2 = {2, 4, 5, 7};

// 以数组初始化一个vector

std::array<std :: string, 5> words {"one", "two","three", "four", "five"};

std::vector<std::string> words_copy {std::begin(words) , std::end(words)};

// 通过 v[index] 获取或者修改元素

std::cout << "v[0] = " << v2[1] << std::endl;

// 获取第一个元素

std::cout << "v.front() = " << v2.front() << std::endl;

// 在末尾插入值为 9

v2.push_back(9);

// 在末尾插入值为 2

v2.emplace_back(2);

// 删除第一个元素,传入的值是一个迭代器

v2.erase(v2.begin());

// 长度

v2.size();

// 删除所有元素

v2.clear();

// 删除末尾元素

v2.pop_back();

// 在末尾插入元素

v2.insert(v2.end(), 3);

}

双向链表 list 

双向链表具有指向前一个节点和后一个节点的指针。C++ 中本身提供了双向链表的实现。

 

#include <list>

void testList() {

list<string> words {"hello", "list"};

// 头部插入元素

words.push_front("push_fron");

words.emplace_front("emplace_front");

// 尾部插入

words.push_back("push_back");

words.emplace_back("emplace_back");

// 指定位置插入

words.insert(words.begin()++, "insert");

// 删除元素

words.remove("push_fron");

// 通过迭代器来访问链表中的元素

list<string>::iterator beg_iter = words.begin();

list<string>::iterator end_iter = words.end();

cout << "beg_iter:" << *beg_iter << endl;

cout << "end_iter:" << *end_iter << endl;

 

for (auto a : words) {

cout << a << endl;

}

}

单链表 forward_list 

单链表只有指向下一个节点的指针,前面关于单链表我们做了好多算法题。

 

#include <forward_list>

void testForwardList() {

forward_list<string> flist {"name", "lefe", "hello"};

// 计算它的大小

auto count = distance(begin(flist), end(flist));

cout << "size:" << count << endl;

// 头部插入

flist.push_front("before3");

// 在头部插入

flist.insert_after(flist.begin(), "before2");

// 在头结点前面插入

flist.insert_after(flist.before_begin(), "before1");

// 遍历单链表

for (auto word : flist) {

cout << word << endl;

}

}

队列 queue

队列是一种先进先出的数据结构,C++底层使用「双端队列」实现。关于队列的更多内容,可以看这篇内容 图解设计一个循环队列。

 

#include <queue>

void testQueue() {

queue<int> s;

// 入队

s.push(1);

// 出队

s.pop();

// 队首

s.front();

// 队尾

s.back();

// 队大小

s.size();

}

双端队列deque

双端队列可以对队头和队尾元素进行操作。在做算法的时候我们设计过一个双端队列图解设计一个双端队列。 

 

void testDeque() {

// 初始化一个空双端队列

deque<int> my_deque;

// 初始化一个含有两个元素双端队列

deque<string> name_queue {"lefe", "wsy"};

cout << "[0] = " << name_queue[0] << endl;

// 获取队头元素

cout << "front = " << name_queue.front() << endl;

// 获取队尾元素

cout << "back = " << name_queue.back() << endl;

// 从尾部入队

name_queue.push_back("bx");

name_queue.pop_front();

}

优先队列 priority_queue

优先队列和普通队列一样只能在队尾插入元素,队头删除元素,但是它有一个特点,队头永远是优先级最大的元素,出队顺序与入队顺序无关。C++ 中的底层使用「堆」实现的,这样时间复杂度可以控制在 O(logn)。

 

void testPriorityQueue() {

// 创建优先队列

priority_queue<int> q;

// 向队列中添加元素

q.push(4);

q.push(1);

for(int i = 0 ; i < q.size() ; i++) {

cout << q.top() << endl;

// 删除第一个元素

q.pop();

}

// 队列是否为空

q.empty();

}

堆heap

堆是一颗完全二叉树,某个节点的值总是不大于父节点的值(大根堆),可以使用数组来表示一个堆,C++ 默认提供的是大根堆。在堆排序中我们有详细介绍了堆。 图解排序 6/10 - 堆排序(题目写出了)。在这篇文章中,我们实现了一个堆动手写个“堆”。 

C++ 中的堆是通过算法实现的,需要导入 #include <algorithm>

 

#include <algorithm>

void testHeap() {

vector<int> numbers {6, 20, 7, 3, 5};

/**提供判断方法*/

// make_heap(numbers.begin(), numbers.end(), [](int a,int b){return a < b;});

// 创建堆后,numbers 中元素的值为: 20,6,7,3,5,大根堆

make_heap(numbers.begin(), numbers.end(), [](int a,int b){return a < b;});

// 向堆中添加元素

numbers.push_back(40);

// 重组堆:40,6,20,3,5,7 大根堆,调用 push_heap 先确保先前的 vertor 是个堆

push_heap(numbers.begin(), numbers.end());

// 移除堆顶元素,需要把 numbers 中的尾部元素移除,不会自动移除

pop_heap(numbers.begin(), numbers.end());

numbers.pop_back();

}

栈 stack 

栈是一种先进后出的数据结构,C++ 底层使用双端队列实现。在以前最小栈算法中我们详细介绍了这种数据结构。 图解最小栈(LeetCode155. Min Stack) 。

 

#include <stack>

void testStack() {

stack<int> s;

s.push(1);

s.pop();

cout << "top=" << s.top() << endl;

s.size();

}

映射 map、unordered_map

map 是一种保存 key 和 vaule 的数据结构,key 是唯一的。C++ 中提供了有序的 map 和无序的 map 「unordered_map」。

 

#include <unordered_map>

#include <map>

void testMap() {

// 初始化

map<string, string> m;

pair<map<string, string>::iterator, bool> ret_iter =

m.insert(pair<string, string>("name", "lefe"));

if (ret_iter.second == false) {

cout << "name have existed" << endl;

}

// 初始化

map<int, string> m2 = {

{2014, "iOS"},

{2015, "Android"},

};

// 单值插入

m["name"] = "wsy";

// 多值插入

m.insert({{"age", "20"}, {"from", "nmg"}});

cout << "size = " << m.size() << endl;

// 使用迭代器删除

m.erase(m.begin());

// 查找

map<string, string>::iterator find_iter = m.find("from");

if (find_iter != m.end()) {

cout << "find" << endl;

}

// 遍历, key 是有序的

for (pair<string, string> v : m) {

cout << v.first << " = " << v.second << endl;

}

// 删除全部元素

m.clear();

}

pair

pair中保存了两个值,这两个值的类型可以是任意类型,也可以不同。通过 first 和 second 来获取对应的值。

 

void testPair() {

pair<string, string> p = {"name", "lefex"};

// 通过first 和 second 来获取第一个和第二个值

cout << p.first;

cout << p.second;

}

元组 tuple

它是 pair 的扩充版,可以存储多个不同类型的元素。

 

void testTuple() {

pair<string, string> p = {"name", "lefe"};

// 创建一个 tuple,类型为 <strinng, int, double, pair>

auto my_tuple = make_tuple("name", 20, 10.3, p);

// 获取第一个元素

cout << "0 = " << get<0>(my_tuple) << endl;

// 获取第二个元素

cout << "1 = " << get<1>(my_tuple) << endl;

}

集合 set 

集合中不能存储相同的元素,它底层基于平衡二叉树实现,在前面的文章中我们通过二分搜索树实现了 set。使用 BST 实现 Set。在 C++ 中 set 是有序的,同时也提供了无序的 set 「UnorderSet」。 

 

#include <set>

#include <unordered_set>

void testSet() {

set<int> s {7, 3, 4};

s.insert(5);

// 3,4,5,7

for (auto v : s) {

cout << v << endl;

}

 

unordered_set<int> us {7, 3, 4};

us.insert(5);

// 7,3,4,5

for (auto v : us) {

cout << v << endl;

}

}

总结

我们介绍了 C++ 语言本身提供的数据结构,有线性结构和非线性结构。这些数据结构在其它语言中几乎也会提供,而且底层实现基本一致,所有只有掌握了这些数据结构原理,在学习一门其它语言变的非常轻松,调用 API 时更爽。

【C++养成计划】不聊学习只谈干货(Day1) 给小白定制的专属《C++21天养成计划》,让你以最快的速度掌握C++编程 阅读详情

相关推荐

SNN系列|编码篇(2)时序编码

Tempotral Coding 选择编码方法是要根据编码对象以及模型如何处理编码信息进行选择,如下是一种时序信息的编码对比: Threshold-based encoding 又称为tempotral contrast,该方法可以用于编解码一段序列,当差值超过阈值时发放脉冲,阈值是根据编码的序列自适应变化的。 使用该编码方法时,实值序列最好是沿时间变化的,因为在根据差分决定是否发放脉冲后,脉冲的顺序与差分顺序有关。 Time-to-first spike coding 该编码方法将信息用神经元首次

Tianlong Lee的博客 1万+

C++ STL:vecotr的at()函数

arr.at(n)与arr[n]的含义一样,返回arr中第n个元素,唯一的区别在于at()函数比[]运算符更安全,因为at()不会去访问越界的元素。可以发现at()函数在使用进行了是否越界的判断,越界则抛出异常。

天道酬勤 2661

Win11下高效管理JDK1.8与JDK17双环境的实战指南

本文提供了一份在Windows 11系统上高效管理JDK 1.8与JDK 17双环境的实战指南。文章详细讲解了如何实现双版本切换,包括如何干净安装两个JDK、通过巧妙配置环境变量实现命令行一键切换,以及在不同IDE和构建工具中为项目独立配置JDK版本,旨在帮助Java开发者彻底解决版本冲突问题,提升开发效率。

ipfs8storage的博客 543

Cocos2d-x3.1编译错误集合(连续更新)

2014.7.22 当出现错误"illegal call of non-static member function"?     解决方法:原因在于没有经过对象,就调用了非静态成员函数,只有静态成员函数(static 相当于全局函数)才能直接调用,普通的成员函数的调用应该是object.MemberFunction(),或pObject->MemberFunction() 静态成员函

yuxikuo_1的专栏 1470

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取 一、Sentinel-2简单介绍 哨兵-2系列卫星的主要载荷多光谱成像仪拥有13个谱段,从可见光到近红外再到短波红外,空间分辨率从10m到60m,能实现全所未有的陆地海洋监测水平。其幅宽高达290KM,且A、B双星组合,覆盖能力比美国Landsat8卫星强很多。目前哨兵-2A和哨兵-2B已经实现了5天的重访时间,即使在之前仅有单颗卫星时,...

weixin_44143671的博客 2万+

UEC++ 虚幻5笔记(数字孪生示例) day13

文件读取与写入,数字孪生入门制作

qq_44924388的博客 3842

调bug:terminating with uncaught exception of type std::out_of_range: vector Abort trap: 6

蒸腾了好久,终于清楚具体原因了! 从执行的异常提示上看是vector越界了,但查了很久没有定位到是哪个vector变量。 在中断位置前后都写类printf,找到了中断的函数,还在函数内写了打印,发现函数压根没进去。就奇怪了,怎么回进不去,没有其他线程,不会是其他地方引起奔溃。这时候本应该早点想起查看一下函数的输入,输入不正确就进不了函数,但从来几乎没遇到过输入引起函数无法进入的情况,所以没有想

噌胥苑——行思驿站 2万+

YOLOv5基于深度学习的道路缺陷检测系统

然而,由于长期的自然侵蚀、车辆磨损等因素,道路表面容易出现裂缝、坑洼等缺陷。这些缺陷不仅会影响驾驶舒适性,还可能引发交通事故,尤其是在恶劣天气或夜间行车条件下。随着人工智能技术的快速发展,基于深度学习的道路缺陷检测技术能够在降低人力成本的同时提高检测效率,为道路维护提供了新的解决方案。本项目构建了基于YOLOv5的道路缺陷检测系统,结合PyQt5开发了用户友好的UI界面,具备实时检测和图片分析功能。工具对图片进行标注,生成YOLO格式的标注文件。上传包含道路裂缝或坑洼的图片,系统会标注出缺陷的位置及类别。

YOLO 1076

python读写文件——生成 数据集的 test.flist 文件 ——【实用教程】

前言:   首先相信打开这个博文的大部分是新人,个人建议,遇到陌生的知识点,可直接去教程类文档查阅,而不是看各种博文,高效收集有用资料也是一种技能; 例如本节代码来源: Python 文件I/O 菜鸟教程 --新人推荐–哈哈 # -*- coding: UTF-8 -*- # 打开一个文件 fo = open("foo.txt", "w") fo.write( "www.runoob.com!\nVery good site!\n") # 关闭打开的文件 fo.close() genFlist.

专注于AI领域前沿技术学习与分享:目标检测、图像修复、超分重建、AI工程化 4486

Flutter SDK的删除与重装:一步步教你如何轻松搞定

在Flutter开发过程中,我们可能会遇到一些需要重新安装Flutter SDK的情况,例如升级Flutter版本、解决依赖冲突等。本文将详细介绍如何删除并重新安装Flutter SDK,让你轻松应对各种问题。

理论都是虚的,代码才是王道。 2247

诊断CAPL自动化(5) ——没有CANdela,无法编辑cdd数据库文件,也能轻松完成诊断测试

🍅我们知道cdd数据库文件,是CANoe测试环境的重要组件,它可以让我们更加轻松的完成诊断测试工作;但是创建和编辑cdd文件是需要CANdela 来完成的,一个 liscense 就要将近二十万,成本确实高🍅特别是在处理22/2E/31服务的时候,频繁的增加功能,可能需要频繁的用CANdela 修改CDD,我测试开发过程中,一般很少去修改cdd,有这个时间,纯手撸也开发完了,就一个CANdela,鬼知道此时此刻到了谁手里,我也懒得去找。🍅演示软硬件环境;目录📘前言。

蚂蚁小兵 5756

c++ 多次封装库

我这里的情况: 我有两个so A 和B,调用程序c B调用A ,B的cmakelist里面要加A和A的头文件: 头文件: include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../android/${MNN_DIR}/include) 库: add_library( A SHARED IMPORTED ) set_target_properties( A PROPERTIES IMPORTED_LOCATIO...

jacke121的专栏 3543

复现CVE-2014-085(Apache ZooKeeper 未授权访问漏洞)

默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据。

记录并分享学习安全的知识点.. 2173

学好这13种数据结构,应对各种编程语言(C++版)

点击蓝色“五分钟学算法”关注我哟加个“星标”,一起学算法作者 |Lefex来源公众号 | 超越技术今天分享一篇朋友的文章,文章配图很精美~学了这么长时间数据结构和算法,...

程序员吴师兄的博客 493

visio安装包

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

语言二叉树的插入 scdn_学好这13种数据结构,应对各种编程语言(C++版)

学了这么长时间数据结构和算法,有必要来个总结了,顺便回顾一下我们这段时间的学习成果。以 C++ 语言本身提供的数据结构为例。如果能掌握这 13 种数据结构,相信在学习其它语言的时候就不费劲了。数组 Array数组在初始化的时候就需要知道其大小,后续是不可以改变其大小的,可以通过下标来获取某个 index 中存放的元素。在 C++ 中通过源码可以知道,它其实是在 C 数组的基础上封装的:#...

weixin_42514709的博客 96

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

TIOBE 7 月编程语言排行榜:C、Java 和 Python 争夺第一

整理 | 郑丽媛出品 | 优快云(ID:优快云news)TIOBE 官方最新发布了 7 月的编程语言榜单,而本月也是 TIOBE 榜单成立 20 周年,一起来看这个月榜单中有哪些最新变...

优快云资讯 1万+

h5cpp C++ HDF5包装器详细安装与配置指南

h5cpp C++ HDF5包装器详细安装与配置指南 项目基础介绍与主要编程语言 项目名称: h5cpp 编程语言: 主要使用C++ 项目简介: h5cpp是一个现代C++接口,用于访问HDF5(Hierarchical Data Format)的完整功能。它旨在提供一个领域中立且易于使用的现代C++风格API,支持Linux、Windows和macOS平台。虽然有两个不同的项目共享相同的名称“h...

gitblog_07221的博客 1041

2026年1月TIOBE编程语言排行榜,Go语言排名第16,Rust语言排名13。C# 当选 2025 年度编程语言。

在 2025 年的前十名中也出现了一些有趣的变化。需要注意的是,TIOBE 指数并不意味着某种语言是“最好的”或是编写代码行数最多的语言。Java 是否能继续凭借其(有时被认为)冗长、样板代码多以及甲骨文(Oracle)所有的背景,抵挡住 C# 的攻势,仍是一个开放的问题。此外,Zig 在 2025 年从第 61 位攀升到第 42 位,看来是进入 TIOBE 前 30 的有力候选者。为便于观察更大范围的变化,下方列出了多年前前 10 名编程语言的排名(请注意,这些为 12 个月期间的平均排名)。

福大大架构师每日一题 3768

C++ 即将超越 Java,TIOBE 6 月编程语言排行榜发布!

本文来自微信公众号:混沌大学(ID:hundun-university),原文摘自《OKR管理法则:阿里巴巴、华为绩效管理实战技巧》(中信出版社2020年6月出版),作者: 王明,洪千武,编辑:混沌大学商业研究团队谢宇航,题图来自:视觉中国前段时间,在某互联网职场论坛上,一位互联网从业者发帖吐槽道:“来公司之前觉得加班没什么,无非是10点下班,反正回家也没啥事,来了公司之后,一周四天要忙到11点半不说,为什么凌晨一点还要跟项目?我本来还想着来公司努力工作加薪升职呢,这一下直接斩杀了我的职业梦想,国企现在还有

qq_41854911的博客 1173

Python、C、C++ 和 C# 中有望诞生 TIOBE 2022 年度编程语言!

整理 | 苏宓出品 | 优快云(ID:优快云news)一月一更新的最新编程语言趋势来啦,快来看看 7 月 TIOBE 榜单有哪些变化吧!年度编程语言或从Python、C、C++和 C# 中诞生过去一个月内,TIOBE 指数并没有太大的变化。目前排在榜单 Top 4 的分别为 Python、C、Java 和 C++,其整体几乎占据了 50% 的编程语言市场份额。相较......

优快云资讯 1万+

TIOBE 4 月编程语言排行|C++越来越流行了?

这个月TIOBE 编程语言排行榜 C++ 又回到了第三位,与 Python 交换位置。当然,这并不是因为 Python 在走下坡路:Python 几乎每个月都在创历史新高。只是 C++ 变得越来越流行了,2019 年 4 月的 C ++ 在 Tiobe 评级中的份额为 8.83%,比去年同期上升了 1.62 个百分点。对于这份报告你怎么看待C++。 不管哪种编程语言,只要你学得好,用得好,喜...

人邮异步社区 767

C# 最有可能摘得“年度编程语言”,Python、Java 正在让位,TIOBE 12 月编程语言榜单最新预测来了!...

整理 | 苏宓出品 | 优快云(ID:优快云news)2023 年正式进入倒计时阶段,TIOBE 年度编程语言即将出炉,究竟会花落谁家?接下来,我们将从最新发布的 TIOBE 12 月榜单中看看有哪些候选者吧!小众语言崛起,主流编程语言让位?要知道 TIOBE 编程社区指数是编程语言受欢迎程度的指标,主要是基于使用 Google、Bing、Yahoo!、Wikipedia、Amazon、You...

优快云资讯 2万+

TeamAI 自动同步揭秘:AI 会话如何静默获取团队最新资源的完整指南

TeamAI 是一款开源的 AI 团队资源管理 CLI 工具(teamai-cli),它的自动同步机制可以让 Claude Code、Codex、Cursor 等 AI 助手在**每次会话启动时静默拉取团队最新的技能、规则与知识**,全程无需人工干预。本文带你彻底搞懂这套机制背后的原理。✨ ## 什么是 TeamAI 自动同步? 想象这样一个场景:管理员更新了团队的编码规则,昨天还有效的技能今

gitblog_01132的博客 992
上一篇: C# 8 新增小功能
下一篇: C# 注释
Abelia
博客等级 码龄7年 72粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值