4 萧-十一

尚未进行身份认证

我要认证

暂无相关简介

等级
TA的排名 3w+

C语言宏定义实现sizeof功能

可以使用如下两个宏定义实现类似sizeof的功能//针对T为一个类型名的情况#define _sizeof_type(T) (size_t)((T*)0 + 1)//针对T为一个变量或者数组名的情况#define _sizeof(T) ((size_t)(&T + 1) - (size_t)(&T))测试代码#include <stdio.h&gt...

2018-07-22 13:26:35

【lintcode】删除二叉查找树的节点

描述给定一棵具有不同节点值的二叉查找树,删除树中与给定值相同的节点。如果树中没有相同值的节点,就不做任何处理。你应该保证处理之后的树仍是二叉查找树。 样例给出如下二叉查找树: 5 / \ 3 6 / \2 4删除节点3之后,你可以返回: 5 / ...

2018-07-15 16:06:48

【数据结构】红黑树小结

红黑树是一种二叉搜索树。性质一颗红黑树满足以下五个红黑性质:每个结点或者是红色或者是黑色。根结点是黑色的。每个叶结点是黑色的。(这个叶节点是树尾端的黑色节点nil)若一个结点是红色的,它的两个子结点必须是黑色的。对于任意一个结点,从该结点到它的每一个后代叶结点的简单路径上,都包含相同数目的黑色结点。一棵有n个内部结点的红黑树,它的高度至多为2lg(n+1)。也就是说,在一棵...

2018-07-14 16:14:59

【设计模式】策略模式

定义策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化UML适用场景针对同一类型问题的多种处理方式,仅仅是具体行为有差别时;需要安全地封装多种同一类型的操作时;出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时。代码示例//策略类class oper...

2018-07-12 15:13:55

【设计模式】简单工厂模式

定义简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类优点工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建...

2018-07-12 14:58:10

【算法】字符串大整数相乘

题目描述: 给定两个以字符串形式存储的大整数,要求以字符串形式输出相乘后的结果。 思路: 模拟计算乘法时列竖式的过程,对于两个字符串s1和s2,让s2的每一位和s1整体相乘,求得一组中间值,然后对中间值做移位操作,最后将移位后的所有中间值相加即可求得最终结果。 问题的关键在于实现两个函数,用于计算两个字符串相加以及字符串和单个字符相乘的结果。//计算两个字符串相加string mya...

2018-07-09 00:35:27

强/弱类型、动/静态类型语言辨析

这是知乎上轮子哥的解释:强类型:偏向于不容忍隐式类型转换。弱类型:偏向于容忍隐式类型转换。譬如说C语言的int可以变成double静态类型:编译的时候就知道每一个变量的类型,因为类型错误而不能做的事情是语法错误。 动态类型:编译的时候不知道每一个变量的类型,因为类型错误而不能做的事情是运行时错误再配上这张图 ...

2018-07-07 14:23:58

【C++】trivial和non-trivial构造函数及POD类型

今天看书看到侯捷的《STL源码剖析》里提到trivial和non-trivial及POD类型,查了些资料理解了一下。trivial意思是无意义,这个trivial和non-trivial是对类的四种函数来说的: 构造函数(ctor) 复制构造函数(copy) 赋值函数(assignment) 析构函数(dtor) 如果至少满足下面3条里的一条: 显式(explict)定...

2018-07-06 16:37:12

【算法】桶排序和基数排序

桶排序假设我们要对n个整数排序,而且这n个数的大小在区间[0,m]之内。那么我们可以设置m+1个”桶”来表示区间内的m+1个数,用数组bucket[m+1]表示。然后遍历n个待排数据,将每个数字放入到它对应的”桶”中。最后我们按照”桶号”递增的顺序将n个数字一次从”桶”中取出,那么取出的数字序列就是排序后的序列了。 桶排序使用了hash的思想,将n个数散列在了m个”桶”中,然后利用桶固有的顺...

2018-07-06 13:37:26

【C++】如何使用基类指针遍历派生类对象数组

今天在一个群里看到一位老哥提出了这样一个问题。1. 基类指针自增起初我认为这是不可能实现的,确实,通过自增基类指针的方式是不能遍历派生类数组的。因为在编译时编译器不知道基类指针所指的对象是基类对象还是派生类对象,所以基类指针自增的移动距离只能是基类对象的长度,但是基类对象和派生类对象的长度往往是不同的,那么如果使用基类指针自增的方式遍历派生类数组就会产生未定义的行为。2.使用虚函数...

2018-07-04 17:06:13

C++中const限定符小结

const限定符const限定符用于定义一个常量const对象在定义时必须被初始化默认情况下,const对象仅在文件内有效。如果在不同的文件下出现了同名的const变量,则视作在文件中单独定义的独立变量。如果想在不同的文件中使用同一个从上图变量,则需要在声明和定义前都添加extern关键字。 //file1.cpp中定义一个const变量 extern const int A = 3...

2018-06-06 14:26:58

【lintcode】子集问题

这里的子集问题是指给定一个列表求它的所有不重复子集的问题。这个问题分为两类:一类是所给列表包含重复元素,另一类是所给列表不含重复元素。分别对应lintcode中17和18题。1.列表不含重复元素的子集这里使用深度优先搜索的思想,递归求解。 代码class Solution {public: /** * @param nums: A set of numbers...

2018-05-24 10:50:17

epoll中监听套接字的触发模式

我们知道epoll有两种触发模式:水平触发(LT)和边缘触发(ET)LT模式若数据可读,epoll返回可读事件 若开发者没有把数据完全读完,epoll会不断通知数据可读,直到数据全部被读取。 若socket可写,epoll返回可写事件,而且是只要socket发送缓冲区未满,就一直通知可写事件。 优点是对于read操作比较简单,只要有read事件就读,读多读少都可以。 E...

2018-05-21 19:26:21

swap的三种实现及区别

我们在实现一个swap函数或者宏定义时,往往会使用以下几种方式:使用辅助变量使用加减法使用位运算我以前使用swap时,从来没有对这三种方法做过区分,认为它们的效果完全一致,即使有区别也只在于使用加减法可能会造成溢出。然而除此之外,它们还是有区别的:那就是当要被交换的两个对象为同一个变量时,后两种方法会产生错误。#define swap1(a,b) {int t = a; a =...

2018-05-02 23:50:25

C语言do...while(0)使用小结

引言在一些C语言程序中我们会看到do...while(0);这样的语句,这样的用法貌似画蛇添足,实际却颇有妙用。单独来看,do…while(0)和顺序执行`...部分的代码的效果并无二致,然而在如下两种情况下的效果却十分巧妙。一.宏定义中实现局部作用域我们知道宏定义只是做一个标识符和字符串的替换,尽管宏定义的形式可以类似于函数,但是它实际并不具备与函数类似的局部作用域。当然了,我们可以...

2018-05-02 16:17:08

使用有限状态自动机构造HTTP报文解析器

首先看一下HTTP请求报文的格式 不同于TCP或者IP报文的首部,由于HTTP的报文首部是文本形式的,我们就无法按字节来提取HTTP首部中的字段。所以要对HTTP请求报文做解析,目的是从文本中提取各字段的值。 从上图可以看出,HTTP请求报文由首部和正文两部分组成,他们由一个空行隔开,在这里我们仅对报文首部做解析。首部又有请求行和请求头两部分。 从图中可以看出报文的各字段都由一些特殊的字...

2018-04-30 21:42:56

C语言的逻辑右移和算术右移

首先说明一下这两个概念: 逻辑右移:右移后左边添加0 算术右移:右移后添加的位与原数的符号位相同在C语言中,对于移位操作执行的是逻辑左移和算术右移,不过对于无符号类型,所有的移位操作都是逻辑的。 所以要相对一个有符号数执行逻辑右移,那么可以先将它强制类型转换为无符号类型。 如下int mian(){ int n = 0xfffffffe; int m = (u...

2018-03-11 15:08:31

Linux--线程池与进程池及线程池的简单实现

转载地址:http://blog.csdn.net/sayhello_world/article/details/72829329池由于服务器的硬件资源“充裕”,那么提高服务器性能的一个很直接的方法就是以空间换时间,即“浪费”服务器的硬件资源,以换取其运行效率。这就是池的概念。池是一组资源的集合,这组资源在服务器启动之初就被创建并初始化,这称为静态资源分配。当服务器进入正式运行阶段...

2018-03-11 10:56:43

背包问题—01背包、完全背包

01背包问题题目有m件物品和一个容量为V 的背包。放入第i 件物品占用的体积是Vi,得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大。思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。所以对于第i件物品,可以转化成与前i-1个物品相关的两个子问题:如果放入第i个物品,那么当前最大的价值f(i,V)就等于将前i-1个物品放入容量为(V-Vi)的背包中...

2018-03-09 21:28:08

【Linux】存储映射I/O—mmap

存储映射I/O能将一个磁盘文件映射到存储空间中的一个缓冲区上,于是可以用对缓冲区的读写代替对磁盘文件的读写,这样就可以在不使用read和write的情况下执行I/O。为了实现这种功能,应首先将一个给定的文件映射到一个存储区域中,这由mmap函数实现。 注:子进程能够通过fork继承父进程的存储映射区。mmap函数#include <sys/mman.h>void *...

2018-03-09 20:41:13

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!