
C/C++
文章平均质量分 61
C/C++专业技术分享
非正经程序员
曾就职于某医疗领域行业Top大厂,现某创业公司负责软件架构设计;
擅长语言:C/C++、Python、Java;
擅长领域:计算机图形学、图像算法、音视频编解码、GPU并行计算、人工智能、架构设计等方向;
专注分享技术干货和工作经验,关注我,不迷路。
展开
-
剑指Offer之用两个栈实现队列
一:题目 用两个栈实现一个队列。完成在队列尾部插入结点和在队列头部删除结点的功能。二:题目分析 首先,让我们知道队列是“先进先出”的特性,而栈是“先进后出”的特性。那么使用两个栈实现一个队列的功能。我们可以想到的是一个栈用于作为入队列的容器,另一个栈可以用来作为出队列的容器。 根据栈的“先进后出”的特性,栈二中的内容可以存放栈一的栈顶元素。然后栈二的栈顶元素就是入队的第一个元素。那么就会有如下的操作步骤:入队列操作即就是入栈一的操作;出队列时,先判断栈二中是否有元素,有元素则出栈,原创 2021-08-01 00:21:31 · 367 阅读 · 1 评论 -
剑指Offer之重建二叉树
一:题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下的二叉树并输出它的头结点。二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;}二:题目分析 首先,我原创 2021-07-26 00:38:12 · 187 阅读 · 0 评论 -
剑指Offer之从尾到头打印链表
一:题目 输入一个链表的头结点,从尾到头反过来打印出每个结点的值。 链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;}二:题目分析 对于该题,一般又两种解法,分别是使用栈结构,先将结点按顺序压栈,然后进行出栈输出。这种符合先进后出的原则。一般的符合先进后出的原则,我们就可以使用递归的手法进行输出。因为函数的调用也是以栈的形式进行的。不过如果链表很长,则会引起栈溢出的现象。三:源码 栈方式:void原创 2021-04-06 00:15:18 · 163 阅读 · 0 评论 -
剑指Offer之替换空格(面试题四)
一:题目 请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”二:题目分析 熟悉网络编程的同学应该都知道为什么要将空格替换成%20,这里就不做过多赘述。1)一般思路 对于该题,一般的解法,就是循环遍历该字符串中的每一个字符,遇到空格后,将空格后的字符串向右移动两位,然后将空格和空出来的位置替换成%20。 对于上面的思路,很明显,每遇到一个空格就要移动O(n)个字符。假设有O(n)个空格字符的字符串,那么原创 2021-03-26 00:08:23 · 147 阅读 · 0 评论 -
剑指Offer之有序数组查找
一:题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。1 2 8 92 4 9 124 7 10 136 8 11 15二:题目分析 如题所示,它的行和列都是递增的。那么我们需要试图找到边界点,这个边界点可以帮助我们排除一整行或一整列。看左上角的1,比1大的可以是第一列和第一行,所以很难排除一整行或一整列。看左下角的6,比6大的数可以原创 2021-03-06 13:30:20 · 188 阅读 · 0 评论 -
剑指Offer之实现一个单例模式
一:题目 实现一个类, 我们只能生成该类的一个实例。二:题目分析 该题也是常见的题目。实现单例,首先单例模式是设计模式中最常见的模式之一。设计单例模式的话,通常需要注意以下几点:类的构造函数、拷贝构造函数、赋值函数声明为受保护成员或私有成员。获取单例的函数设置为静态成员函数注意线程安全性双层判断可以提高获取单例类实例的效率。三:源码设计 结合C++语言的特性,这里我们使用了模板类来完成单例模式的设计。该类为单例类的基类,继承该类的子类都可以成为一个单例类。这种设计具有平台化的原创 2021-03-06 00:09:30 · 151 阅读 · 0 评论 -
剑指Offer之MyString
一:题目 如下为类型CMyString的声明,请为该类型添加赋值运算符函数。 以上是剑指Offer的面试题一,这里我直接实现一下整个字符串类,该面试题出现的频率还是挺高的。主要考察了类的封装、函数重载、构造函数、拷贝构造函数、深浅拷贝、赋值函数、左值、const常量、编码规范等技术点。麻雀虽小五脏俱全,知识点还挺密集的,这大概就是考察频率高的原因吧。二:题目分析构造函数形参是可缺省的,等同于函数的重载。拷贝构造函数的形参是const引用,如果不使用引用,会导致在传参时,循环调用拷贝构造函数,原创 2021-03-04 23:14:16 · 144 阅读 · 5 评论 -
Effective C++ 之《资源管理》
条款13:以对象管理资源条款14:在资源管理类中小心copying行为条款15:在资源管理类中提供原始资源的访问条款16:成对使用new和delete时要采取相同形式条款17:以独立语句将newed对象置入智能指针条款13:以对象管理资源 看如下一个例子:void f() { Investment *pInv = createInvestment(); ... delete pIn...原创 2020-03-21 23:02:32 · 223 阅读 · 0 评论 -
Effective C++ 之《构造/析构/赋值运算》
条款05:了解C++默默编写并调用了哪些函数条款06:若不想使用编译器自动生成的函数,就该明确拒绝条款07:为多态基类声明virtual析构函数条款05:了解C++默默编写并调用了哪些函数 考虑如下一个类:class Empty{}; 这个类其实等价于:class Empty {public: Empty(); Empty(const Empty& other);...原创 2020-03-04 22:43:20 · 253 阅读 · 0 评论 -
Effective C++ 之《让自己习惯C++》
这里写自定义目录标题条款一:新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入条款一:你好! 这是你第一次使用...原创 2020-02-04 09:16:56 · 262 阅读 · 0 评论 -
QT和VS编译前生成版本信息头文件
在工程中经常会使用svn的版本号作为开发版本的迭代的版本信息。如果使用手动配置文件的方式,开发人员可能会经常忘记更新配置文件,这回导致svn版本和软件配置文件的版本信息不一致的问题。所以为了解决这个问题,我们可以将svn版本号信息编译到软件的可执行文件中。那么就需要在编译前通过脚本生成版本头文件(version.h),然后代码中引用该头文件,获取版本宏内容。 经过查阅和实践,我总结了在VS...原创 2019-06-25 13:48:05 · 1001 阅读 · 0 评论 -
浅谈static关键字
c++中对于static的应用如下几种方式: 全局静态变量 给全局变量加上static关键字,该变量被定义为全局静态变量。全局静态变量有如下特点: 1. 该变量被分配在全局数据区,如果未经过初始化,则默认为0 2. 该变量在声明它的整个文件内可见,在文件之外是不可见的,属于内部链接。 3. 其他文件中可以声明与该变量名字相同的变量原创 2017-02-12 22:55:32 · 348 阅读 · 0 评论 -
浅谈c/c++中类的拷贝构造函数和重载赋值函数
拷贝构造函数 拷贝构造函数,顾名思义,在拷贝的过程中进行构造类对象。首先看一个例子进行理解。 一个例子 8 #include 10 using namespace std; 11 12 class copyconstructor 13 { 14 static int objectCount; 15 public: 16 c原创 2017-03-19 23:21:05 · 2990 阅读 · 1 评论 -
浅谈C++中的重载、覆盖、隐藏
在编程中我们经常使用C++中的重载、覆盖、隐藏,那么在这里简单总结下他们之间的区别。 一. 重载 重载应该是这三个中最容易理解的,其本身是面向过程中的语言特性,是不具备多态性的,只是同名函数不同返回值或者不同参数的函数。这里对重载不做多余的赘述。一般在c++中常见的是重载拷贝构造函数,重载构造函数,重载赋值运算符等等。 二. 覆盖 覆盖是面向对象中的一种原创 2017-10-28 14:18:43 · 377 阅读 · 0 评论 -
浅谈dup和dup2的用法
一、dup和dup2函数 这两个函数都可以来复制一个现有的文件描述符,他们的声明如下: #include int dup(int fd); int dup2(int fd, int fd 2);关于dup函数,当我们调用它的时候,dup会返回一个新的描述符,这个描述一定是当前可用文件描述符中的最小值。我们知道,一般的0,1,2描述符分别被标准输入、输出、错误占用,所以在原创 2017-12-04 00:15:16 · 24349 阅读 · 5 评论 -
ubuntu下集显做显示nvidia独显做计算的一种解决方案
nvidia显卡对linux系统一直不是很友好。在众多的桌面发行版上,安装nvidia独立显卡驱动后总是出现各种各样的与集成显卡不兼容的问题。为此,查了很多解决方案,都不是很理想。 有一个需求是这样的:为了减少桌面对nvidia独立显卡性能的消耗,我们想使用集成显卡做显示,独立显卡只用来做gpu的加速处理。但是在ubuntu系统上安装了独显驱动后,boise上设置以集成显卡作为主要显示硬件...原创 2019-03-13 14:39:49 · 4085 阅读 · 0 评论 -
Opencv中访问矩阵Mat中数据性能比对
本文参考作者浅墨_毛星云的著作《OpenCV3编程入门》中的源码和相关内容。Opencv访问矩阵像素方法 在图像处理中,会经常对图像的像素数据进行处理。那么在使用opencv的过程中避免不了去使用矩阵Mat。对矩阵Mat中像素的访问常用的几种方法有:通过获取矩阵数据的指针进行访问通过迭代器访问通过at函数访问 为此,对这三种方式的性能做了相关的测试。测试方法是对图像像素做映射压...原创 2019-06-05 14:45:38 · 1239 阅读 · 0 评论 -
cv::Mat初识和它的六种创建方法
cv::Mat 初识 Opencv种的Mat类,使得Opencv的编程更加的简单,程序员不用过多的去关注内存管理,并且发现Opencv的编程有点像不需要太多编程技术的Matlab一样,甚至有些函数名字都是一样的。所以对Mat的了解是很有必要的。 首先我们在处理一块数据的时候,如果使用Mat类,我们得到的好处是:不需要手动申请一块内存;在不需要时不用再手动释放内存;可以通过类的封装...原创 2019-06-04 14:52:49 · 72407 阅读 · 1 评论 -
Opengl的一些常用功能理解
在使用Opengl的过程中,会经常禁用或开启一些功能,这里经过一些查阅,整理一些对常用的一些功能的理解。后续会不断的补充。1. glShadeModel glShadeModel是设置opengl中绘制指定两点间其他点颜色的过渡模式。一般分为两种模式:GL_SMOOTH(默认)、GL_FLAT。GL_SMOOTH: 以插值的方式,过渡两个点之间的颜色,两点颜色相同,则中间的点颜色也保...原创 2019-06-21 11:22:21 · 927 阅读 · 0 评论 -
使用gdb调试内嵌汇编的代码
前几天公司的产品发生死机现象,程序挂在了内嵌汇编内,由于对内嵌汇编不是很熟悉,但不得不对这段汇编代码进行分析,那么就要需要gdb进行调试了,下面主要是我对汇编代码进行调试所用到的指令。apply all thread bt(查看当前所有线程死机的堆栈)thread (进入死机线程)f (进入死机现场,分析堆栈信息)disassemble(反汇编挂机的函数)info registers(查看原创 2017-01-15 21:46:33 · 1368 阅读 · 0 评论