C++知识分享
文章平均质量分 83
本专栏主要分享C++基础知识,及常见问题的相关解决办法
Dola_Pan
春风得意马蹄疾
展开
-
C++数据结构-哈夫曼树的介绍、查找算法与编码(进阶篇)
其次,将刚才合成的数据作为右孩子,左孩子从未处理的数据中选出最小的一个,作为左孩子,他们的根同样为左右孩子的权值和。由上文的分析可知,构建哈夫曼树时,我们需要根据各个结点的权重值,筛选出其中值最小的两个结点,构建二叉树。霍夫曼编码是一种无前缀编码。不断重复上述的步骤,直到将所有的数据全部处理完并构建出二叉树,这棵二叉树就是我们的哈夫曼树。首先,选出我们数据中最小的两个数据,构建成二叉树的左孩子和右孩子,而根的数据为两者之和。d) 结点的带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积。原创 2024-09-17 10:14:05 · 911 阅读 · 0 评论 -
C++数据结构-树的深度优先搜索及树形模拟法运用(进阶篇)
(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n),DFS搜索的过程访问可以称之为DFS序。如图:原创 2024-09-17 10:13:31 · 1109 阅读 · 0 评论 -
C++数据结构-二叉树的三种遍历方法(进阶篇)
树作为非线性数据结构,在我们取出数据时就需要设计遍历,所谓遍历,就是按照一定的规则性,将数据结构中的所有数据全部依次访问,而二叉树本身并不具有天然的全局次序,故为实现遍历,需通过在各节点与其孩子之间约定某种局部次序,间接地定义某种全局次序,这便是我们常规定的先序,中序,后续遍历。在开始前,请记住下面的这三句话:先序遍历:根左右中序遍历:左根右后序遍历:左右根。原创 2024-09-16 09:59:08 · 1294 阅读 · 0 评论 -
C++数据结构-二叉树的存储方法(基础篇)
如同当时学习链表的创建,首先,我们创建一个空的结点再进行连接,首先将这个空的结点中的date域赋予数据,再判断tree中是否是一个空树,如果为空,只需要将整个根指向这一个结点即可,如果不为空,再进行两个判断,判断输入的数据是否大于或者小于当前比对的结点数据,根据其大小进行相应的排列,这样存储进入的数据总是有一定规律的,在输出的时候根据这个规律进行输出就可以达到想要的效果。a)结点元素,data域,用来存储数据,其可以是int,char等基本的类型,同时也可以是struct等这些复杂的复合数据类型。原创 2024-09-16 09:58:39 · 448 阅读 · 0 评论 -
C++数据结构-树的概念及分类介绍(基础篇)
树是数据结构中的一种,其属于非线性数据结构结构的一种,我们前文所提到的数据结构多数都是线性的,这也是较为简单的数据结构,而接下来的树与图均属于非线性数据结构,也是概念极多的一类。完全二叉树:对一颗具有n个结点的二叉树按层编号,如果编号为i(1原创 2024-09-15 12:04:28 · 1106 阅读 · 0 评论 -
C++广义表的介绍及创建方法-附C语言实现代码
Atom/Node域的内容由tag标志决定,当Tag为0时表示该节点是原子结点(即存放原子数据),当Tag为1时表示该节点为指向下一个广义表的指针(即表结点),Link域存放与本元素同一层的下一个元素所在的结点地址,当本元素时所在层的最后一个元素时,Link域为NULL;对于代码的书写,我们首先需要对传入的字符串进行切割,将每一组括号”()”进行分割,每一组括号其中就表示的一份新的广义表,我们需要找到括号并且与这个括号相互匹配的括号数进行对应,找到并切割掉,以此分离出表头串,方便我们进行后续的操作。原创 2024-09-15 12:04:06 · 1168 阅读 · 0 评论 -
C++中矩阵的介绍及相关应用扩展详解
从前文的代码实现可以看出,矩阵在整个计算机中使用非常广泛,而其实现方式又无不与二维数组这个概念相对应,二维数组是最简单的矩阵表示方式,其便利性可以让我们设计出相当多的矩阵相关的算法,与一维的运算不同,二维的运算无论从理解出发还是计算乃至代码设计出发,都复杂了许多,这就需要充分的数学知识做铺垫,也希望读者能够细细理解代数这一门学科的奥妙。原创 2024-09-14 09:29:54 · 1212 阅读 · 0 评论 -
C++中string字符串类型介绍及数组模拟
但在实际中,编程应该讲究灵活贯通,链表等虽然操作方便,但是其由于指针以及其他结构的设计问题本身占用空间就比较大,因此,灵活掌握合适的数据结构的使用是必须的。这里介绍一个编程的思维——模拟,所谓模拟,就是通过简单易懂的方式,根据所给出的要求,一一进行实现,通过代码模拟出所需要实现的方法过程,模拟的方法不是一种具体的实现算法,而是一种思维。C语言中通过字符相连已经基本创造出了字符串的常规操作,然而,字符串在C语言中并不是常规类型,而是一个类似于数组的结构,在C++中,通过模板类的操作创建了。原创 2024-09-14 09:10:40 · 884 阅读 · 0 评论 -
字符串的KMP算法详解及C/C++代码实现
紧接上文,我们知道了暴力匹配的算法在时间运行上的缺陷,假设字符串T的长度为n,字符串P的长度为m,则整个算法的时间复杂度为O( n * m ),而对于一个复杂的现实情况而言 n >> m >> 2 (即n远远大于m,m远远大于常数),这样的计算计算机的负担很重。对于模式串P而言,我们需要知道模式串中P的每一位的前一位是否存在相等的完全相等的前后缀,并且求这个最大的完全相等的前后缀,如一个模式串”ABCABDE”对于第倒数第二位字符而言,其符合情况的前后缀就是”AB”,而最后一位则没有完全相等的前后缀。原创 2024-09-13 09:08:18 · 550 阅读 · 0 评论 -
C++字符串的常用操作
这并不是最理想的算法,但却这是字符串匹配算法中最容易理解的算法,算法核心为给定一个主串T和一个模式串P,求问是否P是属于T的一个字串,如:”Hello”中”llo”就是其中的一个字串,对于暴力匹配算法而言,我们可以利用两层循环进行比对,第一层循环中找寻T字符串中的每一个字符,第二层循环找寻的是每一个P字符,进入第二层循环时T字符串也会跟着进行字符前进,如果发生不匹配则产生一个回溯回到第一层循环的进入字符的下一个字符。输出Welcome Hello。原创 2024-09-13 09:05:19 · 987 阅读 · 0 评论 -
Linux内存管理知识-堆区和栈区(基础篇)
可执行程序在存储时(没有调入到内存)分为3个部分。加上static,则表示此函数只能在当前文件中被调用。原创 2024-09-12 08:34:05 · 699 阅读 · 0 评论 -
C++如何设计函数多返回值以及如何加速输入输出效率
遇到大数据时,往往读写文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,有很多案例中提供几个数据,却在后台测评却提供了近千,近万的数据量是常事,而很多人会发现,明明算法正确的问题,却总是在超时,但把自己的输入换成scanf,输出换成printf之后莫名其妙又可以通过了,于是便冷眼相对C++的cin与cout。原创 2024-09-09 08:41:48 · 1472 阅读 · 0 评论 -
C++ STL算法从入门及常见运用方法详解
算法主要是由头文件组成。是所有STL头文件中最大的一个,范围涉及到比较、 交换、查找、遍历操作、复制、修改等等。体积很小,只包括几个在序列上面进行简单数学运算的模板函数定义了一些模板类,用以声明函数对象。原创 2024-09-09 08:38:59 · 1228 阅读 · 0 评论 -
C++ STL-deque容器入门详解
deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间。原创 2024-09-08 09:59:03 · 1117 阅读 · 0 评论 -
C++ STL-Map容器从入门到精通详解
也是一种关联容器,它是 键—值对的集合,即它的存储都是以一对键和值进行存储的,Map通常也可以理解为关联数组(associative array),就是每一个值都有一个键与之一一对应,因此,map也是不允许重复元素出现的。同时map也具备set的相关功能,其底层也会将元素进行自动排序。原创 2024-09-08 09:58:23 · 1099 阅读 · 0 评论 -
C++ STL关联容器Set与集合论入门
可以见的,以上的三个函数,其使用方法均是第一个集合开始到结束,第二个集合开始到结束,然后使用back_inserter插入器将数据插入到某一个向量或者其他容器之中,并交差是我们集合运算中的最基本的运算,有了这几种运算,我们可以构建出非常多的集合论中的各种功能,以达到我们的数学功能。集合论,是数学的一个基本的分支学科,研究对象是一般集合。这也是前文学过的标准用法,接下来,让我们了解一个更加先进和便捷的方法,auto方法迭代,这需要我们编译器开启C11标准,每个编译器的开启标准不一,请具体情况具体分析。原创 2024-09-07 09:10:11 · 900 阅读 · 0 评论 -
C++ STL关联容器的概念及种类详解
在实际的开发过程中,合理组织数据的存取与选择处理数据的算法同等重要,存取数据的方式往往会直接影响到对它们进行增删改查操作的复杂程度和时间消耗。事实上,当程序中存在对时耗要求很高的部分时,数据结构的选择就显得尤为重要,有时甚至直接影响程序执行的成败。值得一提的是,之前我们一直在不断地重复实现一些诸如链表、集合等等这些常见的数据结构,这些代码使用起来往往都十分类似,只是为了适应不同数据的变化,可能需要在一些细节上做不同的处理。那么大家有没有想过,是不是可以重复利用那些已有的实现来完成当前的任务呢?原创 2024-09-07 09:09:13 · 741 阅读 · 0 评论 -
C++ STL-Queue容器概念及应用方法详解
回顾一下之前所学的队列,队列和栈不同,队列是一种先进先出的数据结构,STL的队列内容极其重要,虽然内容较少但是请务必掌握,STL的队列是快速构建搜索算法以及相关的数论图论的状态存储的基础。头文件:#include我们以int类型作为参数为例进行创建。标准的队列创建方法是直接创建空队列再进行其他的操作,由于队列的特殊性质,拥有其他容器的参数可以这样创建,这种多参数的方式可能有一些复杂,一般也很少这样使用。原创 2024-09-06 09:01:27 · 1139 阅读 · 0 评论 -
C++ STL-Stack容器概念及应用方法详解
栈是一种先进后出的数据结构,而实现方式需要创建多个结构体,通过链式的方式进行实现,这是标准的栈的思路,而在STL中栈可以以更为简单的方式实现。栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为。栈中进入数据称为 — 入栈 push栈中弹出数据称为 — 出栈 pop头文件 #include格式为:explicit stack (const container_type& ctnr = container_type());原创 2024-09-06 09:00:54 · 1005 阅读 · 0 评论 -
C++ STL-List容器概念及应用方法详解
功能:将数据进行链式存储。链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。链表的组成:链表由一系列结点组成。结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域STL中的链表是一个双向循环链表。由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器。头文件:#include原创 2024-09-05 09:22:22 · 1154 阅读 · 0 评论 -
C++ STL容器-Vector容器概念及应用方法详解
Vector可以翻译为向量,或向量数组,至于为什么以向量命名,可以理解为一维空间也是存在向量的。Vector是最简单的序列是容器,就像数组一样,向量使用连续的存储位置作为元素,这意味着它们的元素也可以使用常量指向其元素的偏移来访问,与数组一样有效。但与数组不同,它们的大小可以动态变化,其存储由容器自动处理。vector为可变长数组(动态数组),定义的vector数组可以随时添加数值和删除元素.原创 2024-09-05 09:15:52 · 860 阅读 · 0 评论 -
C++ STL概念入门及学习内容详解
1.容器(Container)在上一篇文章我们已经基本的了解了什么是C++的STL(标准模板库),在本章中绝大多数内容都是在介绍常用的STL模板的使用以及其一些参数的介绍,但是请注意,STL由于其设计之初就容纳了大量的程序员思维结晶,经过了无数次的讨论才形成了一个统一的标准,它同时拥有大量的内容和知识点,如果完全讲解内容,展开完完全全可以写出一本500页的书,本篇还是以数据结构为主,因此,这里只是入门介绍,而且还主要是略讲与数据结构相关的容器,不是深入讲解。原创 2024-09-04 21:20:20 · 436 阅读 · 0 评论 -
关于C++的一些使用模版-初阶
template class 类模板名 { // 类内成员定义 };这里实现一个顺序表public:, _size(0){}// [fist, last)区间中包含的元素要放置到顺序表中while (it!++count;i < _size;return;_size--;原创 2024-09-01 08:37:46 · 891 阅读 · 0 评论 -
c语言与c++的区别详解
1980年,Bjarne Stroustrup博士着手创建一种新的语言,能够具有面向对象的程序设计特色。在当时,面向对象编程是一个新颖的概念,Stroustrup博士并不是从头开始设计新语言,而是使用C语言进行修改,而这就是C++语言。原创 2024-09-01 08:36:32 · 1141 阅读 · 0 评论 -
数据结构-队列的介绍及循环队列
在开始前,请牢记这句话:队列是一个先进先出的数据结构。队列(queue)是限定在表的一端进行插入,表的另一端进行删除的数据结构,如同栈的学习,请联系前文所学链表,试想一个单链表,我们只能对他的链表表尾进行插入,而只能对链表的表头进行结点的删除,其余一切的操作均不允许,这样强限制性的“链表“,就是我们所说的队列。如图:队列就像一个两端相通的水管,只允许一端插入,另一端取出,先放入管中的球先从管中拿出。原创 2024-08-31 09:42:04 · 1610 阅读 · 0 评论 -
详解数据结构-栈的基本操作以及栈数组、栈链表的实现(C语言代码实现)
在开始前,请牢记这句话:栈是一种先进后出的数据结构。栈(stack)是限定仅在表的一端进行操作的数据结构,请联系我们前文所学的,设想一个单链表我们只能够对其链表的表尾结点进行操作,而操作也只能够进行插入一个新的结点与删除最末尾的这个结点两个操作,而这样强限制性的‘链表’,就是我们所说的栈。让我们重新理顺一下定义:💡栈分为数组栈和链表栈,其区别是数组栈使用数组进行功能的模拟,实现较为快速和便利,而链表栈使用链表的思路去设计,实现较为麻烦,但是其稳定不易出错;原创 2024-08-29 09:54:11 · 806 阅读 · 0 评论 -
链表-链表的基本操作(C语言代码实现)
本篇文章将向您介绍循环单/双链表的插入、删除、遍历操作原理及如何进行,文章最后会给正在学习链表操作的小伙伴提供两道力扣经典习题,后附参考代码。原创 2024-08-29 09:36:53 · 802 阅读 · 0 评论 -
链表-循环链表的介绍和创建(C语言代码实现)
如同单链表的创建,我们需要先创建一个头结点并且给其开辟内存空间,但与单链表不同的是,我们需要在开辟内存空间成功之后将头结点的next指向head自身,我们可以创建一个init函数来完成这件事情,为了以后的重复创建和插入,我们可以考虑在init重创建的结点next指向空,而在主函数调用创建之后手动讲head头结点的next指针指向自身。next表示指针,它永远指向自身的下一个结点,对于只有一个结点的存在,这个next指针则永远指向自身,对于一个链表的尾部结点,next永远指向开头。原创 2024-08-28 09:27:41 · 435 阅读 · 0 评论 -
链表-双向链表的基本设计(C语言代码实现)
单链表在很多时候已经可以胜任很多优秀的操作了,但是,单链表任然存在不足,所谓‘单链表’,是指结点中只有一个指向其后继的指针,具有单向性,有时需要搜索大量数据的时候,就必须要多次进行从头开始的遍历,这样的搜索不是很便利。对于逐步添加数据,我们采取的做法是,开辟一段新的内存空间作为新的结点,为这个结点进行的data进行赋值,然后将已成链表的上一个结点的next指针指向自身,自身的pre指针指向上一个结点。next代表的是后继指针,它永远指向当前结点的下一个结点,注意,如果当前结点是尾结点,则next指针为空。原创 2024-08-27 09:27:24 · 528 阅读 · 0 评论 -
链表-单链表的基本操作及C语言代码实现
遍历的概念想必大家都不会陌生,即就是从链表的头开始,逐步向后进行每一个元素的访问,这就是遍历,对于遍历操作,我们可以衍生出很多常用的数据操作,比如说查询元素,修改元素,获取元素个数,打印整个链表数据等等。删除元素要建立一个前驱结点和一个当前结点,当找到了我们需要删除的数据时,直接使用前驱结点跳过要删除的结点指向要删除结点的后一个结点,再将原有的结点通过free函数释放掉。以上的操作均用到了遍历的思维,针对于遍历还有非常多的用法供自主设计,请参考后文配套的习题进行练习。原创 2024-08-27 09:26:09 · 348 阅读 · 0 评论 -
链表知识-顺序存储和链式存储
C语言使用中,由于以上出现的这些问题,我们链表的概念就应运而生,链表通过不连续的储存方式,以及指针的灵活使用,巧妙的简化了上诉的内容,同时链表是自适应内存大小的,也就是说无论我们设多大的数据,理论上都可以实现(当然不能超过你的机器承载),注意,有许多较晚的语言通过底层的方式解决了数组插入和删除时的时间浪费,如PYTHON。其中DATA为自定义的数据类型,可以是简单的int型,也可以是复杂的struct结构体类型,而NEXT为指向下一个链表结点的指针,通过访问NEXT,可以引导我们去访问链表的下一个结点。原创 2024-08-26 09:30:57 · 579 阅读 · 0 评论 -
链表-单链表的基本设计(c语言代码实现)
在这里我们有一个注意点,就是一定要记住判断是否开辟空间失败,虽然在很多试题中以及常用的环境提供的环境非常安全,几乎没有开辟失败的存在,但是也一定要养成判断是否开辟失败并且判断失败后执行代码,但在生产中由于未知的情况造成一旦空间开辟失败任然在继续执行代码,后果将不堪设想,因此养成这样的判断是很有必要的,在C++中可以使用try-catch这样的语句进行优化。NEXT为一个指针,其代表了一个可以指向的区域,通常是用来指向下一个结点,链表的尾部NEXT指向NULL(空),因为尾部没有任何可以指向的空间了。原创 2024-08-26 09:33:04 · 513 阅读 · 0 评论 -
理解程序运行时内存地址与两个必备的函数知识malloc、free
在开始数据结构的正式代码编写之前,我们得先熟悉一个计算机中重要的概念——,当然这里不是教你如何选购内存条,这里是介绍数据结构学习中必须要掌握的关于内存的基本概念。首先请看这么一张图:(地址的常用表示为十六进制表示法,即Ox+十六进制数)由这个图可以清晰的发现对于每一段的内存中的数据,都有一个地址与之相对应,也真是因为有地址的存在,我们计算机中才可以轻易的去访问到其中数据,拿一个数组来说,数组在C语言中是顺序存储的,因此,如上图的数据直接用代码找到其数据以及地址的话可以这样写。原创 2024-08-25 16:30:11 · 636 阅读 · 0 评论 -
时间复杂度的度量方法详解
对于如何度量其最重要的是观察程序中的循环结构,每一个循环结构代表执行循环中的指令n次,而其余指令一般而言一行代码代表执行一次,对于一个程序而言,执行的次数相差较小其实没有什么区别,都是一瞬间执行完毕。原创 2024-08-25 16:21:20 · 524 阅读 · 0 评论 -
一些学习建议与初步了解数据结构与算法
程序(Program)=数据结构(Data Structure)+算法(Algorithm)”数据结构是计算机专业中一门综合性的基础课程,它是介于数学,计算机硬件和计算机软件的三者之间一门核心课程,同时,数据结构是设计数据库,程序,操作系统,游戏等等设计方面的重要基础,是绝大多数计算机专业考研的指定科目,也是大公司面试时常考科目,同时,也是高中及大学的学课竞赛中必备知识,优秀的数据结构和算法,可见数据结构在计算机课程中的重要性。原创 2024-08-24 11:18:16 · 675 阅读 · 0 评论 -
详解数据结构与算法基础
数据(Data)是信息的载体,是可以被计算机识别,存储并加工处理的描述客观事物的信息符号的总称。数据不仅仅包括了整形,浮点数等数值类型,还包括了字符甚至声音,视频,图像等非数值的类型。原创 2024-08-24 11:40:04 · 768 阅读 · 0 评论