数据结构
文章平均质量分 79
数据结构
高亚奇
医疗仪器软件、上位机开发者
展开
-
[数据结构] [ Qt ] Qt框架与STL库之间 差异、优缺点及适用场景
Qt框架是一个跨平台的应用程序开发框架,它主要用于开发图形用户界面(GUI)应用程序。除此之外,Qt还提供了用于网络、数据库访问、XML处理、多线程等的模块。Qt的一个显著特点是其强大的信号和槽机制,有助于实现松散耦合的代码结构。STL(Standard Template Library,标准模板库)是C++标准库的一部分,它提供了一组通用的模板类和函数,用于处理诸如容器、算法和迭代器等基本数据结构和操作。STL的目标是提高代码的可重用性和抽象性,使程序员能够专注于解决实际问题,而不必关注底层细节。原创 2024-01-26 11:05:09 · 1081 阅读 · 0 评论 -
[数据结构] [ Qt ] Qt 关联容器类 QMap、QSet
Qt库提供了一套通用的基于模板的容器类,可以用这些类存储指定类型的项。比如,你需要一个大小可变的QString的数组,则使用QVector。这些容器类比STL(C++标准模板库)容器设计得更轻量、更安全并且更易于使用。如果对STL不熟悉,或者倾向于用“Qt的方式”,那么你可以使用这些类,而不去使用STL的类。你可以用两种方式遍历容器内存储的项:Java风格的迭代器和STL风格的迭代器。Java风格的迭代器更易于使用,并且提供了更高级的功能;原创 2023-12-13 14:08:53 · 848 阅读 · 0 评论 -
[数据结构] [ Qt ] 顺序容器类 QList、QVector、QStack、QQueue
遍历一个容器可以使用迭代器(iterators)来完成,迭代器提供了一个统一的方法来访问容器中的项目。Qt的容器类提供了两种类型的迭代器:Java风格迭代器和STL风格迭代器。如果只是想按顺序遍历一个容器中的项目,那么还可以使用Qt的foreach关键字。原创 2023-12-13 14:16:07 · 1000 阅读 · 0 评论 -
[数据结构] [ Qt ] 容器类
Qt库提供了一套通用的基于模板的容器类,可以用这些类存储指定类型的项。比如,你需要一个大小可变的QString的数组,则使用QVector。这些容器类比STL(C++标准模板库)容器设计得更轻量、更安全并且更易于使用。如果对STL不熟悉,或者倾向于用“Qt的方式”,那么你可以使用这些类,而不去用STL的类。这些容器类是隐式共享的、可重入的,并且对速度、内存消耗等进行了优化。除此之外,当它们作为只读的容器时是线程安全的,所有线程都可以使用它们。原创 2024-01-25 14:15:40 · 824 阅读 · 0 评论 -
[数据结构] [C++ STL] 常用算法总结
STL算法部分主要由头文件 <algorithm>,<numeric>,<functional> 组成。要使用 STL中的算法函数必须包含头文件 <algorithm>,对于数值算法须包含 <numeric>,<functional> 中则定义了一些模板类,用来声明函数对象。非可变序列算法:指不直接修改其所操作的容器内容的算法。可变序列算法:指可以修改它们所操作的容器内容的算法。排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。数值算法:对容器内容进行数值计算。原创 2024-01-25 14:02:05 · 711 阅读 · 0 评论 -
[数据结构] [C++ STL] map使用详解
map 由红黑树实现,其元素都是 “键值/实值” 所形成的一个对组(key/value pairs)。每个元素有一个键,是排序准则的基础。每一个键只能出现一次,不允许重复。map主要用于资料一对一映射的情况,map 内部自建一颗红黑树,这颗树具有对数据自动排序的功能,所以在 map 内部所有的数据都是有序的。比如一个班级中,每个学生的学号跟他的姓名就存在着一对一映射的关系。#include <map> // map属于std命名域的,因此需要通过命名限定,例如using std::map;原创 2024-01-25 13:59:28 · 358 阅读 · 0 评论 -
[数据结构] [C++ STL] set使用详解
set 容器内的元素会被自动排序,set 与 map 不同,set 中的元素即是键值又是实值,set 不允许两个元素有相同的键值。不能通过 set 的迭代器去修改 set 元素,原因是修改元素会破坏 set 组织。当对容器中的元素进行插入或者删除时,操作之前的所有迭代器在操作之后依然有效。#include <set> // set属于std命名域的,因此需要通过命名限定,例如using std::set;set<int> a;// 定义一个int类型的集合a// error,未定义这种构造函数。原创 2024-01-25 13:57:54 · 366 阅读 · 0 评论 -
[数据结构] [C++ STL] list使用详解
list 由双向链表(doubly linked list)实现而成,元素也存放在堆中,每个元素都是放在一块内存中,他的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变得非常没有效率,因此它没有提供 [] 操作符的重载。但是由于链表的特点,它可以很有效率的支持任意地方的插入和删除操作。#include <list> // list属于std命名域的,因此需要通过命名限定,例如using std::list;// 定义一个int类型的列表a。原创 2024-01-25 13:54:58 · 371 阅读 · 0 评论 -
[数据结构] [C++ STL] deque使用详解
deque(双端队列)是由一段一段的定量连续空间构成,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速。在中间部分安插元素则比较费时,因为必须移动其它元素。#include <deque> // deque属于std命名域的,因此需要通过命名限定,例如using std::deque;// 定义一个int类型的双端队列a// 定义一个int类型的双端队列a,并设置初始大小为10// 定义一个int类型的双端队列a,并设置初始大小为10且初始值都为1// 定义并用双端队列a初始化双端队列b。原创 2024-01-25 13:52:10 · 351 阅读 · 0 评论 -
[数据结构] [C++ STL] vector使用详解
vector(向量): 是一种序列式容器,事实上和数组差不多,但它比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而vector正好弥补了这个缺陷,它的特征是相当于可分配拓展的数组(动态数组),它的随机访问快,在中间插入和删除慢,但在末端插入和删除快。#include <vector> // vector属于std命名域的,因此需要通过命名限定,例如using std::vector;// 定义一个int类型的向量a。原创 2024-01-25 13:50:10 · 386 阅读 · 0 评论 -
[数据结构] [C++ STL] 迭代器(iterator)
指针可以用来遍历存储空间连续的数据结构,但是对于存储空间非连续的,就需要寻找一个行为类似指针的类,来对非数组的数据结构进行遍历。因此,我们引入迭代器概念。迭代器(Iterator)是一种检查容器内元素并遍历元素的数据类型。迭代器是指针的泛化,它允许程序员用相同的方式处理不同的数据结构(容器)。1、头文件所有容器有含有其各自的迭代器型别(iterator types),所以当你使用一般的容器迭代器时,并不需要含入专门的头文件。原创 2024-01-25 13:47:32 · 373 阅读 · 0 评论 -
[数据结构] [C++ STL] 容器
1、STL(Standard Template Library),即标准模板库,是一个高效的C++程序库,包含了诸多常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。2、从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming)。在这种思想里,大部分基本算法被抽象,被泛化,独立于与之对应的数据结构,用于以相同或相近的方式处理各种不同情形。原创 2024-01-25 13:43:59 · 798 阅读 · 0 评论 -
[数据结构 16] 查找之哈希表
首先是需要定义一个哈希表的结构以及一些相关的常数。其中 HashTable 就是哈希表结构。结构当中的 elem 为一个动态数组。原创 2024-01-24 14:20:36 · 357 阅读 · 0 评论 -
[数据结构 15] 查找之哈希表概念
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系 f,使得每个关键字 key 对应一个存储位置 f(key)。我们把这种对应关系 f 称为哈希函数(也叫散列函数)。采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为哈希表(Hash table,也叫散列表)。关键字对应的记录存储位置我们称为散列地址。插入元素时:根据待插入元素的关键码,用哈希函数计算出该元素的存储位置并按此位置进行存放;原创 2024-01-24 14:18:36 · 813 阅读 · 0 评论 -
[数据结构 6] 线性表之顺序表(C++实现)
* "ElemType类型根据实际情况而定, 这里假设为int */public:// 构造函数~SeqList();// 析构函数// 判断是否为空操作// 获取顺序表长度操作// 清空顺序表操作// 获取元素操作// 查找元素位置操作// 附加元素操作// 插入元素操作// 删除元素操作// 遍历顺序表private:// 指向存放顺序表元素的数组// 顺序表的当前长度// 顺序表的最大容量#endif。原创 2024-01-24 13:41:41 · 324 阅读 · 0 评论 -
[数据结构 14] 树之链式二叉树
二叉树,是度为二的树,二叉树的每一个节点最多只有二个子节点,且两个子节点有序。链式二叉树:采用链式存储结构的二叉树。二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域是比较自然的想法。/* 二叉树结点结构 */// 结点数据// 左右孩子指针。原创 2024-01-24 14:12:36 · 830 阅读 · 0 评论 -
[数据结构 13] 树之概念
树(Tree)是 n(n>=0) 个结点的有限集。n=0 时称为空树。在任意一棵非空树中,有且仅有一个特定的称为根的结点。当 n>1 时,其余结点可分为 m (m>0) 个互不相交的有限集 T1、T2、……、Tm。原创 2024-01-24 14:09:28 · 825 阅读 · 0 评论 -
[数据结构 12] 队列之链队列
队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向尾结点,如下图所示:空队列时,front和rear都指向头结点,如下图所示。/* QElemType类型根据实际情况而定,这里假设为int *//* 结点结构 */}QNode;/* 队列的链表结构 */// 队头指针// 队尾指针}LinkQueue;原创 2024-01-24 14:04:57 · 332 阅读 · 0 评论 -
[数据结构 11] 队列之顺序队列
队列的顺序储存结构:用数组存储队列,为了避免当只有一个元素时,队头和队尾重合使得处理变得麻烦,所以引入两个指针:front 指针指向队头元素,rear 指针指向队尾元素的下一个位置,当 front=rear 时,为空队列,结构如下图所示:/* ElemType类型根据实际情况而定,这里假设为int *//* 循环队列的顺序存储结构 */int front;/* 头指针 */int rear;/* 尾指针,若队列不空,指向队列尾元素的下一个位置 */}SeqQueue;原创 2024-01-24 14:02:30 · 843 阅读 · 0 评论 -
[数据结构 10] 栈之链栈
链栈:是指利用链式存储结构实现的栈。想想看栈只是栈顶来做插入和删除操作,栈顶放在链栈的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢,所以比较好的办法是把栈顶放在链栈的头部(如下图所示)。另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的。对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 top=NULL 的时候。/* ElemType类型根据实际情况而定,这里假设为int */原创 2024-01-24 13:58:30 · 386 阅读 · 0 评论 -
[数据结构 9] 栈之顺序栈
在我们软件应用中,栈这种后进先出数据结构的应用是非常普遍的。比如 Word、 Photoshop 等文档或图像编辑软件中, 都有撤销(undo)的操作,也是用栈这种方式来实现的。栈(stack)是限定仅在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In Filrst Out) 的线性表,简称 LlFO 结构。栈的插入操作,叫作进栈,也称压栈、入栈。类似子弹入弹夹,如下图-左所示。原创 2024-01-24 13:55:42 · 325 阅读 · 0 评论 -
[数据结构 8] 线性表之单链表(C++实现)
* "ElemType类型根据实际情况而定, 这里假设为int *//* 线性表的单链表存储结构 */// 数据域// 指针域public:// 构造函数// 析构函数// 清空顺序表操作// 判断是否为空操作// 获取顺序表长度操作// 插入元素操作// 删除元素操作// 获取元素操作// 头部后插入元素操作// 尾部后插入元素操作// 遍历顺序表// 查找元素位置操作private:// 单链表指针#endif。原创 2024-01-24 13:49:48 · 383 阅读 · 0 评论 -
[数据结构 7] 线性表之单链表(C语言实现)
单链表:使用链式存储结构的线性表。单链表中的数据是以结点来表示的,每个结点的构成:数据域(数据元素的映像) + 指针域(指示后继元素存储位置)。如果单链表不做特别说明,一般指的是动态单链表。/* 线性表的单链表存储结构 */从这个结构定义中可以看出,结点由存放数据元素的数据域和存放后继结点地址的指针域组成。带有头结点不带头结点。原创 2024-01-24 13:46:16 · 878 阅读 · 0 评论 -
[数据结构 5] 线性表之顺序表(C语言实行)
使用顺序存储方式的顺序表即为顺序表,存取时间性能为O(1)既然顺序表的每个数据元素的类型都相同,所以可以用 C 语言的一维数组来实现顺序存储结构,即把第一个数据元素存到数组下标为 0 的位置中,接着把顺序表相邻的元素存储在数组中相邻的位置。来看(静态顺序)顺序表的顺序存储的结构定义。#define MAX_SIZE 100 /* 数组长度 *//* "ElemType类型根据实际情况而定, 这里假设为int */// 顺序表结构定义/* 存放顺序表元素的数组,最大值为MAXSIZE */原创 2024-01-24 13:39:42 · 837 阅读 · 0 评论 -
[数据结构 4] 线性表之概念
线性表,从名字上你就能感觉到,是具有像线一样的性质的表。例如一个班级的小朋友,一个跟着一个排着队,有一个打头,有一个收尾,当中的小朋友每一个都知道他前面一个是谁,他后面一个是谁,这样如同有一根线把他们串联起来了,就可以称之为线性表。零个或多个数据元素的有限序列。它是一个序列,元素之间是有个先来后到的顺序。若元素存在多个,则第一个元素无前驱,而最后一个元素无后继,其他元素都有且只有一个前驱和后继。线性表强调是有限的。原创 2024-01-24 13:34:36 · 866 阅读 · 0 评论 -
[数据结构 3] 十大经典排序算法
每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。上面就是优化后的代码,用了一个 bExchange 参数记录新一轮的排序中元素是否做过交换,如果没有,说明前面参与比较过的元素已经是正序,那就没必要再从头比较了,就可以优化到 O(n)。原创 2024-01-24 10:43:38 · 905 阅读 · 0 评论 -
[数据结构 2] 算法
算法是解决特定问题求解步骤的描述,在计算机中为指令的有限序列,并且每条指令表示一个或多个操作。有穷性、确定性、可行性、输入、输出正确性、可读性、健壮性、高效率和低存储量需求事后统计方法(不科学准确)、事前分析估算方法函数的渐近增长:给定两个函数 f(n] 和 g(n),如果存在一个整数 N,使得对于所有的 n>N,f(n) 总是比 g(n) 大,那么,我们说 f(n) 的增长渐近快于 g(n)。用常数 1 取代运行时间中的所有加法常数;在修改后的运行次数函数中,只保留最高阶项;原创 2024-01-24 10:31:59 · 781 阅读 · 0 评论 -
[数据结构 1] 数据结构的作用、概念、术语
本章介绍了数据结构的一些相关概念。数据结构是相互之间存在一种或多种特定关系的数据元素的集合。《大话数据结构 》原创 2024-01-24 10:25:25 · 811 阅读 · 0 评论