自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 svn迁移到git仓库并保留commit历史记录

环境准备sudo apt-get install subversionsudo apt-get install gitsudo apt-get install git-svn迁移首先用svn将代码checkout到本地svn checkout http://svn.company.com/projectname创建用户映射在subversion,每个提交者都在主机上有一个用户名...

2018-11-03 11:22:22 1390 2

原创 golang自定json序列化实现对非ASCII字符进行转义

我的个人博客站点会有最新更新,首更地址:https://www.veaxen.com/golang自定json序列化实现对非ascii字符进行转义.html问题最近接手了一个Golang的项目,说实话,这个项目的坑点太多了,这里就不吐槽了。在改这个项目的一个bug时,发现导致这个bug的其中一个原因是Golang的json序列化与PHP的json序列化结果是不同的,这里举一个简单的例子。对于...

2018-11-03 11:18:47 2121

转载 STL排序算法

以前一直不重视排序算法,因为之前很少有应用场景,最近在面试过程中发现排序算法经常会被问到,有时在一些笔试或者面试题目中需要用到排序算法来解决问题,如果每次都自己手写排序,那么要相当耗时,而且我也不一定在短时间内写出没有错误的排序算法,这个时候STL里提供的排序算法就十分重要了,而且STL中的排序算法都是各个大神优化的成果,我不认为我可以在没有研究的情况下写出能与STL里提供的算法相媲美的排序。总而言

2017-05-13 13:20:26 625

原创 explicit构造函数的作用

下面程序f()被调用时,输出是什么??#include <iostream>#include <string>using namespace std;class Number{public: string type; Number():type("void"){}; explicit Number(short):type("short"){} Number(i

2017-05-13 13:19:43 659

原创 C++空类默认生成哪些函数?

定义一个空的C++类,例如class Empty{}一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,一般编译过去就相当于class Empty{public:Empty(); // 缺省构造函数Empty( const Empty& ); // 拷贝构造函数~Empty(); // 析构函数Empty& operator

2017-05-13 13:19:06 871

原创 Linux下socket编程基础——socket地址API

socket编程指的是一整套关于socket的API编程,不是只有socket()系统调用的使用,还有围绕着这一个系统调用的一整套函数。下面我们将从基础的地方开始,了解如何初步的编写socket程序。主机字节序和网络字节序要学习socket编程,首先先了解下什么是字节序。现代CPU的累加器一次都能装载(至少)4个字节(这里考虑32位机器,下同)。那么这4个字节在内存中的排列的顺序将影响它被累加器装载

2017-05-13 13:18:30 667

原创 Linux下是如何配置解析主机名的(包括DNS服务)

我们要访问DNS服务,必需知道DNS服务器的IP地址,Linux使用/etc/resolv.conf文件来存放DNS服务器的IP地址。下面我们来了解下/etc/resolv.conf文件它的格式很简单,每行以一个关键字开头,后接一个或多个由空格隔开的参数。 resolv.conf的关键字主要有四个,分别是: nameserver //定义DNS服务器的IP地址 domain

2017-05-13 13:17:49 6589

转载 Linux进程间通信之管道(pipe)

管道(pipe)管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信; 实现机制: 管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。一个缓冲区不需要很大,它被设计成为环形的数据结构,以

2017-05-13 13:17:11 600

原创 排序算法总结(一)

1、排序算法的分类在本文的开始,我们先来看看排序是如何分类的。1.1、稳定排序和非稳定排序在待排序的记录中,如果存在多个关键码相同的记录,经过排序后,这些记录的相对次序依然保持不变,即排序后这两个相同的对象具有与排序前相同的顺序,那么就称相应的排序算法是稳定的,否则就是不稳定的。1.2、内排序和外排序所谓的内排序是指所有的数据已经读入内存,在内存中进行排序的算法。排序过程中不需要对磁盘进行读写。同时

2017-05-13 13:16:25 465

原创 快速排序的递归和非递归实现

首先参考《递归如何转换为非递归》,然后根据文中的思想将递归快排转换为非递归快排。先来看看递归快速排序的代码:/*以递归的方式实现快速排序*/void quick_sort(int array[],int left,int right){ if(left>=right) return ; int key = array[left]; int low = le

2017-05-13 13:15:11 395

转载 数据结构之树

树的定义(这是一种递归定义):树是由n个节点组成的有限集合T,其中n>=0。特别的,若n=0,称为空树,如果n>0则T应满足的条件是: 1. 有一个特定的称为根(root)的节点,它只有直接后继,没有前驱。 2. 除根以外的其它节点被划分为m个互不相交的有限集合T1,T2,…,Tm,其中m>=0,每个集合又是一颗树,并且称为根的子树。每棵子树的根节点有且仅有一个直接前驱,但可以有0个或多个直接后

2017-05-13 13:14:31 455

转载 经典算法之八皇后问题

问题描述: 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。下面利用回溯法(递归写法),来求出所有可能的结果:#include <conio.h>#include <iostream>#include <cmath>#include <stdlib

2017-05-13 13:13:39 575

转载 经典算法之传染病问题

问题描述:一个坐标表格,每个单元表格就代表一个地方有传染病病毒存在。 无病毒的地方用0标记,有病毒的地方用1标记。(为了方便表示边界,我在周围加了个-1的墙壁) 而我们实际常常研究的是估算受感染程度,该程序需要在接收一个坐标为输入后以该点为中心向周围的8个方向进行递归拓展,检查周围区域是否被感染。得到的菌群用2来标记。类似的应用有图像处理上的ps可以用这个算法找出某种颜色值的分布。然后要考虑到边

2017-05-13 13:12:30 3843

原创 汉诺塔问题

汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?分析如果是初次接触类似的问题,乍看之下肯定会感觉

2017-05-13 13:11:53 834

原创 腾讯笔试:满二叉排序树问题

题目描述:于一棵满二叉排序树深度为k,节点数为2^k-1;节点值为1至(2^k - 1),给出k和任意三个节点的值,输出包含该三个节点的最小子树的根节点。样例输入:4 10 15 13样例输出:12首先,我们来理解一下满二叉排序树,如下就是一个4层的满二叉排序树: * 8 * / \ * 4 12 * / \ /

2017-05-13 13:09:58 2603

原创 TCP协议详解

一、TCP/IP协议族1.1 四层协议系统应用层:ping应用程序、telnet远程登陆协议、DNS协议(运行在用户空间) 传输层:TCP、UDP、SCTP(流控制传输协议) 网络层:ICMP、IP 数据链路层:ARP、RARP关于各层的详细分析,可以参考《互联网协议入门(一)》和《互联网协议入门(二)》二、TCP协议详解2.1 TCP服务的特点面向连接、字节流和可靠传输面向连接:通信双方都必

2017-05-02 15:42:53 635

原创 腾讯笔试题:输入16的倍数个字符串,按格式排版输出

题目描述:从屏幕上接收16的倍数个字符串,回车后按照如下格式输出:上图有箭头的地方就是要求有两个空,其它间隔一个空格,以16进制输出/* 测试字符串 * abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl **/#include <iostream>#include <string>#include <iom

2017-04-14 01:25:57 810

原创 对C++中构造函数、析构函数、虚函数及普通成员函数的理解

这里我们主要讨论构造函数、析构函数、普通成员函数、虚函数,对这几种函数说说自己的理解。对构造函数的总结对构造函数,我们先来看看如下的代码#include using namespace std;class Base{public: Base(){ cout"This is constructor from Base"<<end

2017-04-08 01:26:31 2078

原创 malloc/free与new/delete的区别

相同点:都可用于申请动态内存和释放内存。不同点:(1)操作对象有所不同。malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构

2017-04-08 00:03:31 293

原创 C的隐式类型转换

这篇文章仅仅针对C语言存在的隐式类型转换做一些分析,关于C++的这方面研究,有时间我再另外写一篇文章。关于隐式类型转换,是指发生在没有明确说明的情况下(C语言风格的强制类型转换就是属于我们程序员有明确说明的),编译器自动帮我们执行的类型转换。通常同类型的数据进行运算、比较和赋值的时候我们是不需要担心的,这里我只是说明不同类型的数据进行运算、比较和赋值时,且我们程序员没有指定类型转换时,编译器是如何帮

2017-04-08 00:02:40 660

原创 递归如何转换为非递归

递归算法实际上是一种分而治之的方法,它把复杂问题分解为简单问题来求解。递归的特点包括:递归过程简洁、易编、易懂;递归过程效率低、重复计算多。考虑递归的执行效率低,可以尝试将递归过程转换为非递归过程。本文就是来探讨怎么转换的。将递归算法转换为非递归算法有两种方法,一种是直接求值(迭代/循环),不需要回溯;另一种是不能直接求值,需要回溯。前者使用一些变量保存中间结果,称为直接转换法;后者使用栈保存中间结

2017-04-08 00:01:53 2029

转载 C++继承:公有,私有,保护

转载自:http://www.cnblogs.com/qlwy/archive/2011/08/25/2153584.html公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。公有继承(public)公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。

2017-03-28 21:57:54 290

原创 <iostream>和<iostream.h>的区别

#include //标准输入输出流#include //非标准输入输出流C++中为了避免名字定义冲突,特别引入了名字空间的定义(namespace),当代码中用时,是继承了C语言的标准库文件的,没有名字空间,因此不用(也不能)使用std::cout。 当代码使用时,输入输出需要引用std::cout。有“.h”的就是非C++标准的,是C的标准库文件,无“.h”的,就要用到命令空

2017-03-28 19:40:02 393

原创 C++中虚析构函数的作用

#include <iostream>using namespace std;class Base{public: Base(){}; ~Base(){ cout<<"这是Base类的析构函数"<<endl; }; virtual void DoSomething(){ cout<<"这是Base类的DoSomething"<<en

2017-03-28 13:19:58 484

原创 构造函数中,虚拟机制不会被执行

#include <iostream>class A{public: A(){doSth()}; virtual void doSth(){printf("This is A");}}class B:public A{public: virtual void doSth(){printf("This is B");}}int main(){ B b;

2017-03-28 11:41:36 581 2

转载 C++函数中那些不可以被声明为虚函数的函数

常见的不不能声明为虚函数的有:普通函数(非成员函数);静态成员函数;内联成员函数;构造函数;友元函数。 1、为什么C++不支持普通函数为虚函数? 普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数。2、为什么C++不支持构造函数为虚函数? 这个原因很简单,主要是从语义上考虑,所以不支持。因为构造函数本来就是为了明确初

2017-03-11 01:38:09 306

原创 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

思路:用stack1来实现队列的push操作,用stack2来实现队列的pop操作,当stack2为空时,将stack1的数据全部压入stack2,等待队列的pop操作。class Solution{public: void push(int node) { stack1.push(node); } int pop() { int resul

2017-03-10 14:12:06 5902

原创 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solutio

2017-03-10 13:43:12 1446

转载 两种方法实现:输入一个链表,从尾到头打印链表每个节点的值

转载自:http://blog.csdn.net/Echo_lin/article/details/47735695在《剑指offer》书中第五题:从尾到头打印链表每个节点的数值。其中提到的方法是通过借助容器vector和配接器stack共同完成;然而,碰巧的是前几日在刷LeetCode的时候,无意中发现一处用到了STL中的翻转函数reverse(),它接受两个BidirectionalIterat

2017-03-09 22:27:55 1187

转载 题目:请实现一个函数,将一个字符串中的空格替换成“%20”

/*题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。*//*分析将长度为1的空格替换为长度为3的“%20”,字符差的产度变长。如果允许我们开辟一个新的数组来存放替换空格后的字符串,那么这道题目就非常简 单。设置两个指针分别指向新旧字符串首元素,遍历原字符串,如果碰到空

2017-03-09 21:55:59 871

转载 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

/*题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。*//*Time:2016-9-8 15:44:52Author:CodingMengmeng*/#include <iostream>#include <vector>using namespace s

2017-03-09 20:59:19 3518 1

原创 将十进制数转换成二十进制数

代码如下:/* 实现将输入的十进制整数转换成二十进制 * 并输出二十进制的结果 * 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J * */#include <iostream>#include <stdlib.h> //提供atoi()void print20Data(int data);int main(int argc,char *argv[]){

2017-03-07 22:59:44 2234

原创 <iostream>和<iostream.h>的区别

#include <iostream> //标准输入输出流#include <iostream.h> //非标准输入输出流C++中为了避免名字定义冲突,特别引入了名字空间的定义(namespace),当代码中用<iostream.h>时,是继承了C语言的标准库文件的,没有名字空间,因此不用(也不能)使用std::cout<<x;。 当代码使用<iostream>时,输入输出需要引用std::c

2017-03-07 19:47:35 349

转载 C++11新特性:Lambda表达式

转自:https://www.devbean.net/2012/05/cpp11-lambda/或许,Lambda 表达式算得上是 C++ 11 新增特性中最激动人心的一个。这个全新的特性听起来很深奥,但却是很多其他语言早已提供(比如 C#)或者即将提供(比如 Java)的。简而言之,Lambda 表达式就是用于创建匿名函数的。GCC 4.5.x 和 Microsoft Visual Studio

2017-03-05 15:54:01 385

原创 C++中构造函数居然是可以直接调用的

代码如下#include <iostream>class A{public: A():a(0),b(0){std::cout<<"调用第一个构造函数"<<std::endl;} A(int x):a(x),b(x+1){std::cout<<"调用第二个构造函数"<<std::endl;} ~A(){std::cout<<"调用析构函数"<<std::endl;}

2017-03-05 14:52:59 8350 2

原创 Linux多线程编程初体验

直接上代码#include "pthread.h" //线程库,线程不是通过内核实现的#include "stdio.h"#include "stdlib.h"#include "unistd.h"void* thread_func(void *arg){ int *val = (int*)arg; printf("Hi!I'm a thread!\n")

2016-09-20 17:13:58 330

转载 归并排序

归并排序是分治思想的一种应用,把复杂大型的问题切分成若干个小问题,在进行一一解决然后进行合并,最后把复杂的问题解决。

2016-09-10 02:39:24 323

原创 用const定义的常量比用#define定义的常量有那些优势

这里只是说明定义常量的优势,#define的作用不仅仅是可以用来宏定义常量,它的使用非常灵活,这里只与const进行定义常量上的比较。1.const 能够明确指定常量的类型。2.const可以使用C/C++的作用域规则将定义限制在特定的函数或文件中。3.可以将const用于更复杂的类型中,比如常量数组,结构、类对象等。4.因为#define是在预处理阶段进行宏替换展开常量的

2016-09-09 22:16:17 1041

原创 【C/C++】数组和指针的区别

前言C/C++程序中,指针和数组在很多地方都会用到,而且通常是可以相互换着使用的,那我们这种时候就更需要了解两者之间的区别了。数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着一块内存,其地址与容量在其生命期内是不可变的,只有数组的内容可以改变。指针可以随时指向其他变任意类型的内存块,也就是“可变的”,指针远比数组要灵活和高效,指针访问数组元素比采用数组形式访问元

2016-09-09 20:27:36 1121

原创 【C/C++】指针与引用的区别

引用是C++对C语言的扩展,引用可以理解为变量的一个别名,所谓别名就是人还是同一个人,只是多了一个名字而已,对变量也是如此。如:int a = 10;int &b = a;这里b就是变量a的一个别名,他们代表的内存地址是完全相同的,注意这里b不是指针,c++没有规定引用的底层实现,所以编译器实现引用时,可以为引用分配空间,也可以不分配空间。引用与应用的主要区别有以下三点:

2016-09-09 19:59:47 699

空空如也

空空如也

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

TA关注的人

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