Makefile傻瓜教程
Makefile是组织代码编译的一种简单办法。make工具和makefile是比较复杂且强大的,本教程甚至还没有触及到make工具的皮毛,但是作为入门指南,它可以帮助你快速又轻松地为中小型项目创建自己的Makefile。
(翻译改写自https://www.learncpp.com/cpp-tutorial/15-1-intro-to-smart-pointers-move-semantics/)
考虑下面这个函数,在这个函数中我们动态申请了一片内存。
1 | void someFunction() |
这段代码看起来非常直白,但是存在一个问题:我们常常会忘了释放内存。即使我们始终记得释放内存,但是还存在一些case导致内存没有正确释放。
平常在使用GDB调试程序的时候,我们经常需要查看一个STL容器里面存储的元素的值是多少。但是用GDB的p命令打印容器,得到的却是一堆乱七八糟的东西。比如有一个vector<int> nums = {1,2,3}
,当我们使用p nums
命令时,我们得到的结果是:
Q: 如何设计一个特殊的栈,支持min()操作,返回栈中的最小元素.
这个问题来源于去年面试遇到的一道题目,面试官给了20分钟时间让设计这样一个栈.当时时间有限,虽然写出来了一个版本,但是那个版本还存在很多的问题,比如不够通用,只能支持int
类型数据;同时,效率也不高, 存在大量的数据拷贝.
C++中引入的引用类型,给我们带来了很大的方便。通过向函数传递引用,我们既可以享受像传递指针一样直接修改变量值的优点,又避免了空指针和野指针造成的问题。在日常开发中我们应该尽量使用引用,避免使用指针。但是引用到底是什么,看起来好像引用跟指针有着千丝万缕的联系,同时两者又有很大的差别,那么引用跟指针到底是什么关系呢?教材上通常会说,引用就是变量的别名,但是光看这句话可能还是不太明白引用的本质。其实按照我的理解引用可以看做一种特殊的指针,在这里做一个总结。
指针和引用的区别主要有以下几点:
在论坛上看到一个同学贴的一段代码如下:
1 | #include<stdio.h> |
设计算法,返回二叉树T的先序序列的最后一个节点,要求非递归,不能使用栈。
先序遍历先遍历根节点,然后遍历左子树,最后遍历右子树。因此如果有右子树的话,最后一个节点肯定在右子树里面,一直往右走就可以,如果没有右子树的话,最后一个节点肯定在左子树,往左走一步就可以,一直迭代下去直到没有子节点为止。
1 | class TreeNode : |
那么相应的,我们可以设计出算法返回中序遍历序列的最后一个节点。
中序遍历就是先遍历左子树,然后遍历根节点,最后遍历右子树。因此如果没有右子树,那么根节点就是最后一个节点;如果有右子树,最后一个节点就在右子树中。迭代下去,找到没有子节点的节点返回即可。
1 | def getLastNodeOfPreorderTravel(self, root): |
最后,你可能会想如何获得后序遍历的最后一个节点呢?后序遍历顺序是先遍历左子树,后遍历右子树,最后遍历根节点,因此最后一个节点必然是根节点。直接返回即可。