本章给大家带来的是C++内存管理。在C语言阶段,我们经常使用malloc,calloc,realloc,free进行内存管理。但是,C语言的内存管理存在很多缺陷,会对程序的稳定性和安全性造成影响。不过,C语言的内存管理同时也给程序员提供了更大的自由度和灵活性,可以更加精细地控制程序的内存使用。而C++有他自己的一套内存管理,就是:new和delete。C++中的内存管理是一项非常重要的任务。C++为开发人员提供了灵活的内存管理功能,但同时也带来了内存泄漏、野指针等风险。所以,小伙伴们一定要扎扎实实弄清楚内存管理~
引用在c++中的使用非常常见,可以说是很重要的,引用的常引用相关的问题让很多人稍不留神就出错了,这里我们就来谈谈常引用的问题。关于权限有权限缩小和权限放大的问题,比如一个文件,当初它只有读的权限,而现在你给它再加个写的权限,这就是权限放大;又或当初它读,写的权限都有,但你把他某个权限或所有权限都限制了,这就是权限缩小。在指针和引用赋值中,权限可以缩小,但不可以放大:这里通常指的是变量的值可不可以改的问题,如果说是从改到不能改,这就是将权限缩小了,这是可行的;如果说是从不能改到能改,这就是权限放大了,此时是不行的。 而引用相当于起别名,对于这个别名的权限相对于本名变量有什么变化,这需要自己来决定。当自己决定别名的权限之后(不能与第二点表达的起冲突),对它的使用就要留个心眼。
本章给大家带来的是C++类和对象!在面向对象编程中,类是用来描述某个类别对象通用属性和行为的模板,它是一种抽象的数据类型,包括成员变量和成员函数。而对象则是类的实例,是具体存在的数据,拥有自己的状态和行为。当我们创建一个对象时,就是根据类的定义来分配内存,创建对象实例,并初始化对象的成员变量以及相关状态。类具有封装、继承和多态等特性。封装性将数据和操作数据的行为封装在一个类的内部,并且只向外部提供必要的接口,以保证数据的安全性和一致性。继承机制允许我们从已有的类中派生出新的类,新的类可以沿用基类的数据和行为,也可以自定义扩展新的数据和行为。多态是指同一函数或方法在不同情况下表现出不同的行为,可以通过虚函数和接口来实现。(本章只涉及封装这一特性,继承和多态的讲解在后续文章会推出)类和对象这一节的知识点,贯穿了整个C++的学习,深刻理解类和对象和熟练使用类和对象是后面C++学习的坚实的基础。
由C语言到C++,这是一个即刺激又艰难的过程,说他刺激,是因为学会用C++后就不会再想用C语言,说他艰难,是因为C++是一门古老复杂的语言,很多工作多年的C++程序员都不敢说他精通C++(哈哈哈)。当然了,也别听到这些就被劝退了,C++经过了这么多年的发展,其语言的成熟度自然是有的,并且,如今世界主流的计算机语言当中依然有`C++`的身影,这就说明,C++这门语言是有他独特的风格来吸引人们的。C++的运行速度很快,是因为C++比较接近底层。这也是C++受欢迎的优点之一。有人说,学好C++再去学其他任何语言都很容易上手,但学好其他语言就不一定了。
>?排序可谓是老生常谈了,在这里,我给大家带来一些常用的排序算法。 >?常用的排序算法有八个:**直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序(快排),归并排序,计数排序**。每一个排序算法都有其独特的思想,我们不仅要学会它的思想,还要能够在合适的场景中选出合适的排序算法。因此,这一块,要很熟练很熟练。 >?本章所有的排序均以升序为例来讲解,弄懂了升序,降序也是不在话下。
本章给大家带来的是八大排序中的选择排序和堆排序。选择排序为什么被称为最烂的排序?堆排序如何来操作?最开始如何对数组建堆?
我们在学习当中,最常见的算法莫过于排序算法了!而常见的排序算法有八种,本章给大家讲解八大排序中的==直接插入排序和希尔排序
二叉树可以说是我们学习数据结构路上的第二个高的台阶,要想跨越它,需要我们*画图,多理解,多思考它的递归过。前面树的介绍和堆这两篇文章让我们对树有了一定的了解,对于二叉树的概念也有说到,因此,本章不会对二叉树的概念及介绍深入去讲,而是着重于它的实现,着重于理解递归。二叉树是后面一些高阶数据结构的基础,例如:红黑树,AVL树,B树等等。并且,我们在面试当中,也经常会被面试官要求手撕二叉树的相关OJ题,所以,二叉树这一章节就显得额外重要,可不敢遇到困难就退缩了。本章实现的二叉树是一棵普通的二叉树,与之前的数据结构有所不同,它的增删查改功能没那么有意义,那么什么时候有意义呢?我们在普通二叉树的基础上加上某一性质,使其能够通过这一性质来管理左右子树,这时候的增删查改就有意义了,例如**搜索二叉树等等。搜索二叉树:所以本章的二叉树,是打基础。我们在学习的过程中,一定要细细品味整个递归的过程,最好就是画图理解。接下来就带大家实现一棵属于自己的初等二叉树吧!
前面了解了树的概念后,本章带大家来实现一个跟树有关的数据结构——堆。本章有对堆排序和topk问题的讲解普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把 ==堆== (一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。
本章给大家介绍一下树。树的难度相对于前面的数据结构来说,又高了一个台阶,所以我们要先从最基础的开始,也就是本章的一些知识点。树又分为很多种树,如 二叉树,红黑树,AVL树,B树等等,这些的难度都相对较大,所以大家对本章树的一些概念以及一些基本性质的理解必不可少。本章除了对树的介绍,还有基础的二叉树的相关介绍,目的是为了大家能够更好的理解树。
前面我们 用队列实现了一个栈 ,用栈实现了一个队列 ,相信大家随随便便轻松拿捏,而本章将带大家上点难度,我们来 设计一个循环队列。对于循环队列,重点就在一个 ==“ 循环 ”,意思也就是该队列首尾相连形成一个环,但其本质还是不变,队列 先进先出 的性质依旧存在,只不过环的大小有限定(限定放多少数据就只能放多少数据)。那么我们如何来设计这样的一个环,使它既能够像队列一样,又可以体现循环的性质?下面就带大家探讨一波。
上一章我们用队列实现了一个栈,而这一章就带大家用栈实现一个队列。用队列实现一个栈,用的是两个队列,其出栈操作可以说是最麻烦的一步,它通过倒数据的方式最后完成出栈。而用栈实现一个队列,很明显也是需要两个栈来完成的,其出队操作其实也与倒数据的方式有关,不过两个实现方法有所不同。用队列实现栈,是通过队列的 先进先出 的性质来实现栈的 后进先出 的性质;而用栈实现队列,是通过栈的 后进先出的性质来实现队列的 先进先出 的性质,大家别弄混淆了。
前面我们相继实现栈和队列,是不是愁没有练手的地方呢?别担心,本章带大家用队列来实现一个栈!我们都知道,栈和队列可以看作为兄弟,一个后进先出(LIFO),一个先进先出(FIFO),他们虽有不同的性质,但总的来说还是不分家的,因为,我们既可以用队列实现栈,也可以用栈实现队列,而本章就先来带大家来了解如何使用队列来实现栈。
栈和队列可以说是一对好兄弟,前面学习了栈,那队列当然也少不了。对于栈而言,队列可以说具有与他相反的性质,本章就给大家领悟一下队列的魅力。队列是一种简单的数据结构,它的主要性质,就是数据先进先出(FIFO),我们可以利用这一性质,在做某些算法题时,以此为切入点,如:单调队列等等。所以说,我们要熟练其性质。
前面我们学习了链表,总算是跨过一个台阶了,本章带大家轻松一波,领悟一下栈的魅力。栈是一种较为简单的数据结构,它的主要性质,就是数据后进先出(LIFO),我们可以利用这一性质,在做某些算法题时,以此为切入点。因此,栈还是挺不错的。
前面学习了单链表的结构,并且做了些许单链表的OJ练习,相信大家已经对单链表的结构了如指掌。因此,本章带来了与单链表同源的但拥有不同的结构的链表---带头双向循环链表供大家学习。可能大家听到带头双向循环链表这个名字,就会认为该结构很复杂(的确很复杂,是链表当中结构最复杂的),肯定比单链表要难许多,说实在的,如果没有前面单链表的铺垫,直接上这个结构,那肯定挺难的。但现在我们有了单链表的基础,并且做了挺多单链表的题了,也就不用怕了。
本章的链表OJ练习,是最后的也是最难的。对于本题,我们不仅要学会解题的思路,还要能够通过这个思路正确的写出代码,也就是思路转化为代码的过程,这应该就是最难的地方了吧。对于OJ练习(5),环形链表的做法的证明一定要理解透彻,因为面试很可能问到噢。
本章的OJ练习相对于OJ练习(4)较为简单。不过,本章的OJ最重要的是要我们证明为何可以这么做。这也是面试中常出现的。分割链表以一种类似于归并的思想解得,回文链表以一种巧妙复用前面OJ题的思想解得。啰嗦一下:对于本章,最重要的是需要证明为什么这样做可以,所以我们不光要做出来OJ,还要能够理解并自行给出证明。
* 本章的OJ练习相对前面的难度加大了,但是换汤不换药,还是围绕单链表的性质来出题的。我相信,能够过了前面的OJ练习,本章的OJ也是轻轻松松。对于OJ练习(3):着重需要理解的是相交链表那道题的双指针思路,明白为什么可以这样,这样为什么可行。后面遇到类似的题目我还会做么?我们每做一道题目,都要深挖他的题目结构,明白为什么可以这样做。我相信如果你这样去做了,并且不断地练习,到后面,每遇到一个题目,你都会有所印象,并能够很快的指出解这道题的思路。
本章的OJ练习也是相对简单的,只要能够理解解题的思路,并且依照这个思路能够快速的写出代码,我相信,你的链表水平已经足够了。对于OJ练习(2):其中两道题都可运用快慢指针解题思路,这使得两个题都只需要遍历一次链表即可解答。
对于单链表的OJ练习,需要深刻理解做题的思路</font>,这样我们才能够在任何场景都能够熟练的解答有关链表的问题。关于OJ练习(1):其题目较为简单,思路也好理解,本章与1差不多,难度不大,核心点就在于理解解题思路。
单链表的OJ练习(1) # 反转链表 # 合并两个有序链表 #
在学习数据结构时,单链表可谓是第一个需要跨越的台阶。从`C语言`到`数据结构`,单链表能够真正的反映我们`C语言`到底学的扎不扎实,那是因为,单链表对于`C语言`中的指针,结构体,以及函数模块的实现**有较高的要求。因此,通过本章的学习,要是能够自我实现单链表,那你的`C语言功底`会厚实,你的`代码能力`也会提升。
顺序表作为数据结构中的小小弟,还是很好应付的。说到数据结构,顺序表是我们的向导,它让你明白数据结构到底是干啥的,为啥数据结构这么的重要。实际上,通讯录的底层就是一个顺序表,里面的增添联系人,删除联系人等一系列操作,都是基于顺序表实现的,这也侧面拖出了数据结构的作用。所以,学好数据结构是必须的。
当我们在利用计算机进行一些计算时,可能会遇到这类问题 : 有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了,但因受到硬件的限制,往往达不到实际问题所要求的精度
关于时空复杂度的分析,是每一个程序员的必备技能,本文将带你了解什么是时空复杂度?熟知怎样去计算一个算法的`时间复杂度`和`空间复杂度`
上篇文章介绍了一个程序运行的 编译与链接,其中编译阶段有个预处理,他会对一些预处理指令进行处理,本章就对这些预处理相关的指令,操作符等等进行探讨
每当我们运行一段代码时,编译器都会自动的帮我们编译代码并将代码转换为一个二进制可执行文件(`.exe`), 有了这个可执行文件,便可以执行我们写的程序了。那么编译器对代码的编译以及生成可执行程序的过程是怎样的呢?这个问题便是本文章将要探讨的。
我们有可能会写通讯录,写过通讯录的都知道,如果没有文件操作,程序运行后输入的数据在程序结束就没有了,联系人信息也就没有了,如果不能存放联系人的信息,那通讯录还有什么用?所以必然的我们需要文件操作来将输入的联系人的信息存放到文件当中,下一次运行时再将之前已经保存在文件中的联系人的信息拿出来,这一系列的操作就是C语言的文件操作,对应的就需要使用一些相关操作函数。简单来说,文件操作能够将输入的通讯录的数据存放在硬盘文件中,这样就做到了数据的持久化。
也许你从来就没有听过`柔性数组(flexible array)这个概念,但他是真的存在;柔性数组的概念存在于C99标准当中,C99标准表示:结构体的最后一个成员可以是一个大小不确定的数组,这个数组就叫做柔性数组;既然搭配了`柔性`这一修饰词,那么这个数组就不会是”耿直“的了。
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号