自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

CodeCAT

有一段路途,不知者不在意!

  • 博客(46)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 华为、腾讯等企业面经分享

华为、腾讯等企业面经分享    从大学到现在,一直断断续续的在做着c++开发的工作。也参加了华为、腾讯、今日头条等不少的公司,也拿了一些不错的special offer,但是一直没有认真的写一篇面经。     最近比较有时间,准备好好的总结一下,希望能帮助到需要的人。这里可能只能大概的写一下面试的流程和范围,具体的问题和答案,可能后续会专门写一个帖子。     我是17年的本科应届毕业生,...

2018-07-12 23:24:24 3444 1

原创 C++类构造函数初始化列表

C++类构造函数的初始化列表c++类构造函数的初始化列表是一个挺有灵性的东西,值得花一些时间去研究下。类对象的构造顺序初始化和赋值的差异必须使用初始化列表的场景成员初始化顺序类对象的构造顺序1.分配内存,调用构造函数时,隐式或显式的初始化各数据成员;2.进入构造函数后在构造函数中执行一般赋值与计算。初始化和赋值的差异对于类的构造函数,有如下两种形式...

2018-04-26 00:12:30 1056

原创 匿名函数与闭包

匿名函数与闭包匿名函数  匿名函数是指不需要定义函数名的一种函数实现方式。在Go里面里面可以像普通变量一样被传递或使用,Go语言支持在随时代码块中定义匿名函数。   匿名函数由一个不带函数名的函数声明和函数体组成,如下所示:func (a, b int, z float64) bool { return a*b < int(z)}匿名函数可以直接赋值给一个...

2018-02-12 00:03:19 474

原创 Java的引用和C++的指针

Java的引用和C++的指针都是指向一块内存地址的,通过引用或指针来完成对内存数据的操作,就好像风筝的线轴一样,通过线轴总是能够找到风筝,但是它们在实现,原理作用等方面却有区别。(1)类型:引用其值为地址的数据元素,Java封装了的地址,可以转换成字符串查看,长度也可以不必担心。C++指针是一个装地址的变量,长度一般是计算机字长,可以认为是个int。(2)所占内存:引用声明时没有实体,不占空间。C+

2017-03-08 10:26:59 464

原创 Shell script执行方式

利用直接执行的方式来执行script直接命令执行(不论是绝对路径还是在$PATH内),或者是用bash来执行脚本,该script是在子进程内的bash内执行的,当子进程内的各项变量结结构变量结束而不会传回到父进程中。 利用source来执行脚本,在本父进程中执行,各项变量均会被保存

2016-11-27 23:28:59 862

原创 warning: incompatible implicit declaration of built-in function ‘exit’

在使用标准错误输出和error变量进行错误处理,都是在可预知的情况下进行处理,也就是说可在对预知发生的错误先进行错误处理。 例如,用户编程实现一个简单的除法程序。从屏幕输入被除数和除数,计算它们的商输出。如果用户输入的的除数是0,就会产生错误,使用捕获信息,在0被除的情况下,系统内核将向进程发生信息SIGFPE,可以在程序中捕获该信息进行处理。 #include <stdio.h> #i

2016-07-16 12:44:13 1831

原创 设计模式 I ——简单工厂模式(Factory)

设计模式 I ——简单工厂模式(Factory)问题概述在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。简单工厂模式用于创建对象,添加新对象时不会影响以前的系统代码。 核心思想是用一个工厂类来根据输入条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。示例:简单计算

2016-06-26 21:28:28 708

原创 设计模式 II ——策略模式(Strategy)

设计模式 I ——策略模式(Strategy)问题概述在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们需要根据环境或者条件的不同选择不同的算法或者策略来完成该功能。 一种常用的方法是编码在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法,但是问题在于,如果需要增加一种新的查找算法,需要修改封装算法类的源代码

2016-06-10 15:58:47 557

原创 常用UML类图总结

在UML类图中有以下几种常用关系:接口、关联、聚合、复合、依赖、继承、链接泛化(Generalization)【继承关系】:指定一个类型继承或实现另一个类型的特性、操作和约束 【代码实现】:继承 【关系符号】:带箭头的实线,箭头指向父类 例如:水果和苹果,苹果是水果的一种,苹果继承于水果。 接口与实现(Realization)【实现关系】:指定一个类型继承或实现另一个类型的特性、操作

2016-06-10 12:39:18 598

原创 基于VS2013的UML设计

Visual Studio 2013提供了强大的UML设计功能,使得我们可以方便的使用它简化对于程序的设计。在 文件——>新建——>项目 中选择建模项目在左上角功能栏中选择 体系结构——>新建关系类图(当然也可以根据现有工程生成)这里选择常用的类图为例再右侧 工具箱 中即可选择需要的类图 拖至需要的位置

2016-06-10 10:23:05 533

原创 CreateFile、WriteFile、ReadFile

读写文件每一个软件开发显目必定涉及的工作。CreateFile函数用于创建对应的文件句柄,WriteFile函数是用来写数据到文件,ReadFile函数是从文件里读取数据出来。CreateFile 该函数用于生成设备(文件)的对应句柄(HANDLE)。//CreateFile函数声明HANDLE CreateFile(LPCTSTP lpFileName, //文件名

2016-05-28 00:47:45 16119

原创 copy-and-swap改进"异常安全"

在了解到异常安全的重要性的重要性后,马上想到自己在刚学C++的时候,在单链表上所做的尝试,记得那个惨不忍睹的赋值函数是这样写的:template <class Temp> LinkList<Temp> & LinkList<Temp>::operator=(LinkList<Temp> &List) { DestoryList();

2016-05-19 13:17:49 666

原创 QDialog对话框中show()和exec()

QDialog继承自QWitget,自然从基类继承了一个显示函数show(),然而QDialog自己还提供了一个特殊的显示函数exec(),二者的区别如下:show(); 显示一个非modal的对话框,控制权立刻返回给调用函数,弹出窗口是否是model对话框,可由modal值决定。exec(); 显示一个modal的对话框,并且锁住程序 直到用户关闭对话框为止,函数返回一个DialogCode结

2016-05-15 23:05:14 4119

原创 从operator=中“自我赋值”看new的抛出异常

在Effective C++中看到这个问题时才发现以前写的代码完全没有注意过这个问题“自我赋值”发生在对象被赋值给对象本身时,例如:class Weight{...};...w=w;虽然这看上去确实非常的蠢,但是谁也不能保证这不会发生,毕竟这是合法的,但是问题出来了,我们写的显示赋值函数一般是这样的,假设我们在类中使用了动态分配。class Bitmap{...};class Weight

2016-05-02 21:39:52 508

原创 动态库的使用方法

在编写程序时,动态库是常常用到的工具,在vs等编程环境下只需要,完成工程的本地化配置或是直接将dll配置到环境变量即可(不推荐,毕竟小题大做了),而对于像楼主这样刚刚接触Linux操作系统的菜鸟来说,配置动态(共享)库还不是一个简单的问题。在介绍动态库的调用方法之前,先介绍一下动态库的编译(如何生成so文件)需要一个包含几个方法声明的头文件和对应的定义文件。再介绍共享库的显示和隐式调用

2016-04-16 15:50:45 8363

原创 STL伪函数应用

我们先来看一个剑指offer中的编程练习题吧:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。这个编程练习并不难,有两个关键点: ①在于int和string之间的转换方便排序; ②在排序时要完成两个记录的全排列再比较。看到在排序时需要特殊操作,我们完全可以借助STL提供

2016-04-13 13:30:25 586

原创 算法初探——堆排序

堆可以说是一种数据结构,但似乎又不完全是,它本质上是一棵完全二叉树堆需要满足以下两个·条件: ①父节点的键值总是大于或等于(小于等于)任何一个子节点的值。 ②每个结点的左右子树依旧是一个二叉堆。当父节点的键值总是大于等于子节点的是最大堆;当父节点的键值总是小于等于任何一个子结点的是最小堆。堆的存储结构这样的储存结构有极为重要的特点:① 结点 i 的父节点为 ( i - 1)/2;

2016-04-10 20:49:57 539

原创 算法初探——归并排序

原理:假设初始记录序列含有n个记录,则可以看出是n个序列的子序列,每个子序列的长度为1,然后两两归并,得到【n/2】(向上取整)个长度为2或者1的子序列,再通过两两归并………直到得到一个长度为n的子序列。过程如下图所示: 归并算法是建立在递归操作上的一种排序算法,是分治思想的典型应用。

2016-04-09 21:12:26 561

原创 算法初探——希尔排序

希尔排序(Shell Sort)是D.L.Shell于1959年提出的一种排序算法,可以称之为第一批突破O(n^2)的排序算法。实质为分组的插入排序先将整个待排序的序列根据增量分割成若干个子序列,分别进行直接插入排序,然后缩减增量,继续排序。直接盗图 O(∩_∩)O~ 上面的示例中,序列的长度为10: 第一趟排序的gap(增量为5),对所有分组完成插入排序,完成后将增量减半gap=gap/2=2

2016-04-09 20:15:28 786

原创 算法初探——插入排序

插入排序(Insertion Sort)是一种玩扑克的时候用的方法,我们摸牌时已经抽到的牌我们已经排好序了,抽上来一张新牌,我们一般不会直接放在最后,等全部抽完之后再进行排序,而是抽上来之后立刻放到对应的位置。 可以看GIF图了 抽牌的顺序就是 6 5 3 1 8 7 2 4这里需要注意的操作是如何做到将新插入的记录放到它应该待的地方,而保证放好后序列依旧是有序的?以3为例,当检测到它之前的

2016-04-09 17:39:04 415

原创 算法初探——选择排序

选择排序(Selection Sort)就是通过n-1次关键字之间的比较,从n-i+1个记录中选择出最小的记录,并和第i个记录做交换。 简单来说就是 ①从第i个记录向后找一个最小的值 ②将找到的记录与第i个记录交换即可 ③重复上述步骤直至整个序列排序完成 找不到动态图了郁闷(:зゝ∠) 就只能自己画图了

2016-04-09 16:37:52 480

原创 算法初探——冒泡排序

无论使用何种语言,在学习数组的时候我们接触的第一个算法都会是这个排序算法。它有个好听的名字冒泡排序。冒牌排序(Bubble Sort) 一种交换排序,它的基本思想就是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录。

2016-04-09 16:11:19 360

原创 有趣的数组

螺旋矩阵对一个如下所示的矩阵 规律是从首坐标开始依次螺旋增大很多面试题都喜欢问这样的问题,解决的方法很简单,把复杂的问题分解成简单的问题。 ①把一个矩阵分层,一层一层的解决; ②再分层的基础上,再将一层分成上下左右四个部分单独解决; 只要注意一下数组的边界即可循环完成,有一点需要注意当数组的大小为奇数或是偶数时是有稍许不同的需要注意一下。

2016-03-30 12:56:37 1006

原创 struct、union的内存分配

曾经在一次面试中提到了这个问题,我觉得这里值得总结一下。在回答上述问题之前,我们先来回顾一下各自不同的数据类型占多少之将字节。那么对于struct只用将所有类型所占的空间累加,而union不同,它所占的内存为其中定义的单个最大的内存。 那么我们可以很清楚的看出下面测试的答案#include <iostream>struct { char c; int al; short

2016-03-27 20:55:27 605

原创 浅谈const限定符——c++

一、const 定义符号常量 在学习c语言的时候,我们使用#define来定义符号常量。而在c艹中提供了一种更好的处理符号常量的方法。就是使用const关键字来修改变量的声明和初始化。 通过宏定义常量的方法为#define LENGTH 1000再看看使用const的创建常量的通常格式:const type name = value;使用const的优点: ①const可以定义数据类型,而宏无

2016-03-27 20:25:58 591

原创 二叉排序树

二叉排序树(Binary Sort Tree),又被称为二叉查找树,它是一棵空树,或是具有以下性质的树: ①若它的左子树不为空,则它的左子树上的所有结点的值小于根节点的值; ②若它的右子树不为空,则它的右子树上的所有结点的值大于根节点的值; ③它的左右子树也是二叉排序树;c++实现#ifndef BST_H_#define BST_H_using namespace std;#defin

2016-03-26 11:29:44 513

原创 二叉树的模板类实现

二叉树的定义 二叉树(Binary Tree)是n>0个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两棵不相交的分别被称为左子树和右子树组成。·不存在度大于2的结点; ·左右子树是有序的,次序不能任意的颠倒。 二叉树的链表存储方式 二叉树的每个结点最多有两个孩子,所以设计一个数据域和两个指针域,我们称为二叉链表。 二叉链树的结点定义为template<typenam

2016-03-20 21:25:53 7209 3

原创 树的三种表示方式

树(tree)是n个结点的有限集合。n=0时称为空树,在任意一颗非空树中: ①有且仅有一个特定的称号为根(root)的结点; ②当n>1时,其余结点分为m(m>0)个互不相交的有限集合T1,T2…Tm,其中每一个集合本身又是一棵树,并且称为根的子树(subTree); 特别注意只要有相交的子树的就不是树。 每一个结点所拥有的子树的个数称为结点的度(Degree)度为0的结点称为叶子结点(Le

2016-03-20 14:54:29 11440 2

原创 return() 与exit() 的区别

在初学编程的过程中,往往return和exit我们不做过多的区分,都只认为是程序的结束,但是其实在具体的操作上有些区别,我们将借助vfork从栈的操作上理解二者的区别

2016-03-19 17:31:39 2885

原创 链队列的模板类实现

队列是一种先进先出的(First in First out)的数据结构,只允许插入的一端为队尾,允许删除的一端为队头。 链队列的存储示意图如下 需要注意的是在链队列中,front指针并不是指向队头的,而是指向一个固定的头结点。换句话说,无论队头如何变化,该链队列存储的初始位置不会发生变化。 整的队列的操作如下 注意红色的表示的指针从生成之后就没被修改过了,也就是说在队头之前还有个

2016-03-19 15:26:20 897

原创 顺序栈的模板类实现

从数据结构的角度看,栈也是线性表的一种,其特殊性在于栈其基本的操作还是依靠线性表实现的。 栈只允许在栈顶进行插入和删除操作。 栈的存储方式也分顺序栈和链栈两种,个人觉得既然只运行对栈顶进行操作,链栈没什么意义啊。class Stack{public: Stack(int size = Stack_init_size); ~Stack(); void ClearSt

2016-03-17 22:59:04 1726

原创 链表回文

给定一个字符串,判断字符串是否是回文,很简单从两头向中间扫或是从中间向两头扫,依次对比即可。 对于链表无法完成从后向前的操作,因此解决的方法为先定位链表的中点,再将链表后半段置逆,最后利用两个指针依次逐一对比即可。void LinkList&lt;Temp&gt;::Reverse(int nStart, int nEnd) //将链表从第nStart到nEnd置逆 {...

2016-03-17 21:13:45 1036

原创 算法初探——快速排序

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。基本思想 ①先从数列中取出一个数作为基准数; ②分区过程,将比这个数大的数全部放到它的右边,小于等于它的数放到它的左边;...

2016-03-13 16:01:38 589 1

原创 单链表的模板类实现

数据结构是初学编程时候的一个天坑,去年大一的时候学的那叫一个惨烈,虽然C++提供标准的list类库,但是自己动手实现这些常用的数据结构,不仅能对数据结构的认识更深,也对C++中深浅复制,重载,复用等内容更好的理解。 线性表的链式存储结构是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的也可以是不连续的),因此为了表示每个数据元素与其直接后继的逻辑关系,除了存储本身的信息之外,还需

2016-03-13 11:38:28 13965 3

原创 算法初探——查找算法(顺序,折半)

查找排序是比较常用的算法,查找的方法很多这里先介绍两个最简单的查找方法,顺序表查找和折半查找。顺序查找(Sequential Search)又名线性查找,是最基本的查找技术,它的查找方式为:从表中第一个(或最后一个)开始,最后逐个进行记录的关键字和给定值做比较,若某个记录的关键字和给定值相等,则查表成功,如查表找到第一个记录,若关键字和给定值的比较都不等时,查找不成功。 折半查找(Binary

2016-03-12 10:24:13 914

原创 字符串的组合

字符串的所有组合 如果求字符串的所有排列,而是求字符串的所有组合,当输入的字符串是“abc”则它的组合有“a”“b”“c”“ab”“ac”“bc”“abc”。N个字符的全部组合问题可以分解成从N中1至N个字符组合,而对于从N中取M个数组合,可以分为以下两种情况: ①取这N个字符中的第一个字符,再从后面N-1个字符中取M-1个; ②不取这N个字符中的第一个字符,再从后面N-1个字符中取出...

2016-03-08 13:30:32 1400

原创 字符串的全排列

已知字符串中的字符是互不相同的,现在把他们任意排列(例如,若已知字符串是“ab”,则任意输出排列是“ab”“aa”“ba”“bb”),编程输出全部的所有组合。不同于输出全排列,只需要在函数中设置首位和后面各位的循环递归即可。同以上思路要从“ab”中延伸出“aa”“bb”可通过将首位赋值给后面各位循环递归完成(需要一定的限制条件)。/*字符串的全排列已知字符串的字符是互不相同的,现在...

2016-03-08 10:34:08 1623

原创 字符串的包含

如果两个字符串中的字符一样,出现的次数也一样,只是出现的顺序不一样,则可以认为这两个字符串是兄弟字符串。例如,“bad”和“abd”即为兄弟字符串。 在书中提到的一个检验是否包含的算法是位运算算法,可将长字符串用位运算的方法计算出一个“签名”(58位二进制表示,‘A’ASCII值为65,’Z’ASCII值为122,两个字符差值属于[0,58]),在逐一将端字符串中的字符放入查找。方法十分巧妙。 ...

2016-03-08 09:51:38 2128

原创 字符串的旋转

拜读了July所写的编程之法,收益良多,将学习过程中,编写的书中练习题的答案贴出来,因为感觉自己想的可能还有不足,大家交流一下。 1.1字符串的旋转 单词翻转 输入一个英文句子,翻转句子中单词的顺序。要求单词内的顺序不变,句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如,若输入“I am a student.”则输出“student. a am I”....

2016-03-07 22:55:39 1430

转载 华为、中兴编码规范

编码规范存在的意义是,不要以后看自己写的程序时,大骂“这堆乱七八糟的是啥玩意”

2015-08-27 08:52:00 1451

文件隐藏于BMP图片中

基于windows API()接口完成将txt文件隐藏于BMP图片中,该程序为32WIN控制台程序

2016-05-26

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除