cpp
realxie
网易游戏研发工程师
展开
-
C++核心指南-中文版本-(翻译持续更新中)
“在c++内部是一种更小、更简单、更安全的语言。”– 本贾尼·斯特劳斯特卢普C++核心指南 像C++一样是在本贾尼·斯特劳斯特卢普的领导下共同努力的成果,也是是多个组织进行多年讨论和设计的成果。它们的设计鼓励通用性和广泛采用,但是可以自由地复制和修改它们,以满足组织的需要。开始这些指南可以在CppCoreGuidelines中找到,该文档使用GH风格的MarkDown。该指南刻意保持...翻译 2019-05-24 19:25:28 · 2984 阅读 · 1 评论 -
二叉树两个结点的最低共同父结点(树)
题目:二叉树的结点定义如下:struct TreeNode{ int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight;};输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。解法:要想找到两个节点的最低共同父结点,其实就是找一个节点,使得它的左子树包含两个结点中的一个结点,右子树包含另原创 2012-07-30 20:11:47 · 5908 阅读 · 0 评论 -
最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
最大子序列最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。你已经看出来了,找最大子序列的方法很简单,只要前i项的和还没有小于0那么子序列就一直向后扩展,否则丢弃之前的子序列开始新的子序列,同时我们要记下各个子序列的和,最后找到和最大的子序转载 2012-07-28 20:52:29 · 2888 阅读 · 0 评论 -
linux下安装protobuf教程+示例(详细)
1 在网站 http://code.google.com/p/protobuf/downloads/list上可以下载 Protobuf 的源代码。然后解压编译安装便可以使用它了。安装步骤如下所示: tar -xzf protobuf-2.1.0.tar.gz cd protobuf-2.1.0 ./configure --prefix=/usr/local/protobuf原创 2012-04-12 23:33:25 · 23623 阅读 · 2 评论 -
重载new和delete来防止c++工程中内存泄漏
在C/C++中指针给编码带来的极大的方便,但是同时由于分配的指针需要编程人员自行释放内存,因此容易造成内存泄漏,C++中自带的new/delete本身没有提供内存泄漏检测的功能,不过我们可以重载这两个函数来追踪内存的分配和释放,以此来检测程序是否出现了内存泄漏。算法的思想是在new一块内存时将该块内存的地址以及出现的文件和行号信息记录到一个map数据结构中,以内存地址作为key。释放该内存时将ma原创 2012-04-08 15:29:54 · 7954 阅读 · 0 评论 -
c++/cpp中auto_ptr用法分析
本文将分析一下c++中自带的auto_ptr在使用中需要注意的一个问题。首先看一段代码:// auto_ptr example#include #include using namespace std;int main () { auto_ptr p1 (new int); *p1.get()=10; { auto_p原创 2012-04-08 11:30:02 · 6008 阅读 · 1 评论 -
判断一段文件是UTF-8编码还是GB2312的编码方式
对于只包含中文和英文的文本中判断编码方式是非常简单的,中文的编码方式最常用的是GBK,字符集更大的如GBK向下兼容GB2312,其中包含的的很多一部分字符是我们在日常生活中用不到的,因此在实际中我们一般只需要区分GB2312和UTF8编码。这里我只是提供一种可行的方法,如果判断GBK也可以采用类似的方式首先分析一下汉字在GB2312中的编码方式,gb2312规则汉字采用双字节编码其中第一字节161原创 2012-03-10 16:01:18 · 17823 阅读 · 1 评论 -
C++编译器无法捕捉到的8种错误
C++是一种复杂的编程语言,其中充满了各种微妙的陷阱。在C++中几乎有数不清的方式能把事情搞砸。幸运的是,如今的编译器已经足够智能化了,能够检测出相当多的这类编程陷阱并通过编译错误或编译警告来通知程序员。最终,如果处理得当的话,任何编译器能检查到的错误都不会是什么大问题,因为它们在编译时会被捕捉到,并在程序真正运行前得到解决。最坏的情况下,一个编译器能够捕获到的错误只会造成程序员一些时间上的损失,转载 2012-03-26 13:18:20 · 3772 阅读 · 0 评论 -
cpp程序性能优化
1. 重中之重 - 算法优化: 程序性能优化最显著的优化方法是算法上的优化,算法的优化对性能的提升往往是一个数量级的,例如排序,冒泡的时间复杂度为O(N^2),而快速排序的时间复杂度为O(Nlog(N)),这种性能的提供是非常明显的。 2. 消除冗余的循环: 我们先看一下for循环生成的汇编代码for (int N = 4原创 2012-02-18 18:55:53 · 2931 阅读 · 0 评论 -
全排列算法
1. 考虑第一种情况即元素中没有重复的,本算法采用递归的方法很容易求出// Print the permutationvoid PrintPermutation(const vector & per){ static int count = 1; cout << count ++<<"\t: "; for(int i = 0; i < per.size(); ++i) { co原创 2012-10-02 21:08:40 · 5247 阅读 · 0 评论 -
打印所有括号匹配排列方式
对于2对左右括号,其排列方式有:( ( ) )( ) ( )4对括号的排列方式有:( ( ( ( ) ) ) )( ( ( ) ( ) ) )( ( ( ) ) ( ) )( ( ( ) ) ) ( )( ( ) ( ( ) ) )( ( ) ( ) ( ) )( ( ) ( ) ) ( )( ( ) ) ( ( ) )( ( ) ) ( ) ( )原创 2012-10-02 17:10:34 · 5701 阅读 · 0 评论 -
MacOS 玩转C++17
距离C++17发布已经半年有余,由于编译环境的问题一直无法体验到C++17的编程乐趣,趁着Mac系统更新,抢先体验一下C++17的强大之处。1. 关联式容器遍历新方式&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&原创 2018-07-06 11:32:21 · 2567 阅读 · 0 评论 -
C++中单引号“字符串”的用法
我们知道在C++中单引号用来表示单个字符,那么当用单引号括住多个字符时会出现什么情况呢?原创 2014-04-09 23:08:32 · 10804 阅读 · 1 评论 -
寻找两个有序数组中的第K个数或者中位数
假设有长度分为为M和N的两个升序数组A和B,在A和B两个数组中查找第K大的数,即将A和B按升序合并后的第K个数。解法一:使用两个指针指向A和B的开头,很容易在O(M+N)的时间内完成,此算法略过。解法二:使用二分的方法。算法思想在代码注释中#include #include #include using namespace std;//Notic原创 2012-10-16 17:25:32 · 16964 阅读 · 2 评论 -
字符串字典顺序比较
//使用迭代器进行字典顺序比较template bool Compare(Iterator first1, Iterator last1, Iterator first2, Iterator last2){ for (; first1 != last1 && first2 != last2; ++ first1, ++ first2) { if (*first1 < *first2)原创 2012-09-25 16:26:41 · 5370 阅读 · 0 评论 -
在字符串中找出连续最长的数字串
写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为1原创 2012-09-24 11:26:43 · 5911 阅读 · 1 评论 -
动态规划求不相邻的最大子数组和
其实这个问题原题是这样描述的:有N个节点,每两个节点相邻,每个节点只与2个节点相邻,因此,N个顶点有N-1条边。每一条边上都有权值wi,定义节点i到节点i+1的边为wi。求:不相邻的权值和最大的边的集合。对于这个问题可能看起来不是很好处理,把问题更加规范化一些:给出一个数组,求出其中一个子集,使得子集中每个元素在原数组中两两都不相邻并使子集的和最大。因为不能选择两个相邻原创 2012-10-12 11:51:44 · 13340 阅读 · 6 评论 -
对程序性能优化的总结
1. 重中之重 - 算法优化:程序性能优化最显著的优化方法是算法上的优化,算法的优化对性能的提升往往是一个数量级的,例如排序,冒泡的时间复杂度为O(N^2),而快速排序的时间复杂度为O(Nlog(N)),这种性能的提供是非常明显的。2. 消除冗余的循环:我们先看一下for循环生成的汇编代码for (int N = 4, i = 0; i 15 movl $4, -原创 2012-10-12 10:25:41 · 5391 阅读 · 0 评论 -
递归地反转一个栈
//// The code is used to reverse a stack recursively//#include #include using namespace std;// We can think about how we can reverse a stack with another stack.// Cause stack is a structure f原创 2012-10-03 16:18:11 · 6508 阅读 · 0 评论 -
一句话搞定string类型大小写转换之transform用法
对于cpp中的string类型大小写转换用的可以说非常频繁,下面是使用STL实现的一种非常简单的方式进行转换std::transform (strExt.begin(), strExt.end(), strExt.begin(), ::toupper ); //将strExt转换成大写。其实transform的用法非常广泛,下面对其进行简要介绍。查看transform的标准定义原创 2012-02-21 09:58:42 · 7681 阅读 · 0 评论 -
编写标准的字符串复制(strcpy)函数
C++中strcpy函数定义在string.h库中,其标准形式如下:char *strcpy(char *dest, const char *src);可以实现如下:char *strcpy(char *dest, const char *src){ assert(dest != NULL && src != NULL); //对参数合法性进行判断 char * pdest原创 2012-02-19 20:47:51 · 3150 阅读 · 0 评论 -
设计一个不能被继承的类
在c++中每个类都一个构造函数和一个析构函数,即使用户不明确定义,系统也会类定义一个默认的构造函数和析构函数。当创建该类的对象可以显示或者隐式调用构造函数,当对象销毁时会自动调用析构函数。当有子类继承父类,创建子类的对象时,会自动调用父类的构造函数,同样当对象销毁时也会自动调用父类的析构函数。在类属性中private不允许用户和子类调用该函数的方法。因此要想使用原创 2012-02-19 20:33:49 · 2560 阅读 · 0 评论 -
TBB(intel threading building blocks)内存分配算法(一)
开篇:最近研究了一下TBB的内存分配算法,发现设计的非常优雅,故和大家分析一下它的算法思想。既然是开篇,那么我们就先从最基本的入手来看一下TBB基于Cache对齐的内存管理算法。首先来明确几个概念。cache: 现代的cpu都引入的cache的概念,即cpu在参与运算时并非每次都去内存中取得数据的,而是将内存中的一部分数据直接存储在cpu的cache中,cpu中的cache采用的静态随机存原创 2012-02-11 15:14:46 · 6774 阅读 · 0 评论 -
寻找无序数组中的第K大数
利用快速排序的思想,其中K从1开始int quicksort(int * x , int l , int r , int k){ if(l == r && k==1)return x[l]; int i , j ; for(i=l-1 , j=l;j<r;j++) if(x[j]<x[r])std::swap(x[++i] , x[j]);原创 2012-02-08 23:07:19 · 2243 阅读 · 0 评论 -
关于char字符移位问题
看下面的代码,能够猜出输出结果吗?char ch = (char)0x80;ch >>= 7;cout结果是255, 0XFF!unbelievable!,为什么呢,我作一点猜想,可能是由于编译器自身的考虑,char字符在移位的时间先将char 转换成整数,自然0x80转换成整数肯定是一个负数,所以在32位整数中前面24位肯定都是1,所以右移的时候就出现了补1的问题原创 2012-02-08 22:47:13 · 8013 阅读 · 2 评论 -
小量压缩简单算法
本方介绍一种简单的数据压缩算法:SB (simple block)作者:realxie在对文档进行倒排的时候经常涉及到对倒排文档的压缩,例如假设有单词instance 出现的文档有<1,3 ,4 , 6 ,9 ,10,... >,即倒排表以升充排列,这样我们就可以在倒排文件中只保存前后两个文档位置的差量,即转变之后结果为<1 ,2 , 1 , 2 , 3 , 1 , ...>,原创 2012-02-08 23:05:03 · 3766 阅读 · 2 评论 -
C语言字符串函数大全
函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例:#include #include int main(void) { char string[10]; char *str1 = "abcdefghi"; stpcpy(stri转载 2012-02-07 17:43:05 · 16971 阅读 · 2 评论 -
linux下c++多线程下统计程序运行时间(非常注意)
一般在C++程序中我们会使用clock()函数来统计程序的运行时间,格式如下:clock_t begin , end;begin = clock();//这里是要统计时间的代码end = clock();unsigned uRunTime = (end - begin) * 1.0 / CLOCKS_PER_SEC * 1000;这样就得原创 2012-02-05 21:00:53 · 10687 阅读 · 2 评论 -
一组字符串散列函数
unsigned int RSHash(const std::string& str){ unsigned int b = 378551; unsigned int a = 63689; unsigned int hash = 0; for(std::size_t i = 0; i { hash = hash * a +原创 2012-01-07 17:17:31 · 658 阅读 · 0 评论 -
C++ 单例模式析构函数的运用
单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程 序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一 个窗口管理器,一台PC连一个键盘。单例模式有许多种实现方法,在C++中,甚至可以直接用一个全局变量做到这一转载 2011-12-21 10:46:21 · 20659 阅读 · 4 评论 -
指针数组/数组指针
C/C++中有两个非常容易混淆的十分常用的但是又特别不引起人注意的两个概念,指针数组和数组指针,或许你已经对这两个概念早有耳闻,但是不知你有没有对他们做过细致的分析来区别二者呢? 下面我们来看下百度百科上是如何对二者进行定义的 数组指针 一:数组指针:数组名本身就是一个指针,指向数组的首地址。注意这是声明定长数组时,其数组名指向的数组首地址是常量。而声明数组并原创 2012-02-12 16:15:12 · 33907 阅读 · 2 评论 -
C++ 中 vector 如何实现内存分配
>中对顺序容器的内存分配是这样描述的,内容太多,简写一下:为了支持随机访问,vector中的元素采用顺序存放,即每一个元素紧挨着前一个元素进行存储。那么现在只有可能出现问题了,当内存中没有足够连续的空间去存放新插入来的元素怎么办,C++是这样处理的:重新分配内存空间,将原来旧的元素全部复制到新的存储空间中去,然后再插入新的元素。因此可以看出,如果内存不是特别充足或者内存中没有较大块的空原创 2012-02-12 16:09:14 · 9381 阅读 · 0 评论 -
一百度笔试题目分析
问题:有101个数,为[1,100]之间的数,其中一个数是重复的,如何寻找这个重复的数,其时间复杂度和空间复杂度是多少?解:假设这101个数存放在Data[101]的数组中一> 采用hash的方法,该方法可以申请一个100个字节,然后扫描这个101个数据,该方法需要的空间为O(N),时间复杂度为O(N)char Buff[101];memset(Buff, 0 , sizeo原创 2012-02-26 23:28:21 · 5031 阅读 · 0 评论 -
设计一个不能被复制的类
在C++中如果要求一个类能被复制需要实现赋值运算符或者复制构造函数,因此要想一个类不能被复杂,只需将这两个函数设置private访问属性即可class NoCopy{public: NoCopy(){}private : NoCopy(const NoCopy & copy){} NoCopy & operator = (const NoCopy & copy){}}原创 2012-02-25 13:21:21 · 4195 阅读 · 0 评论 -
C/C++/CPP中与虚拟存储器(指针)有关错误汇总(一)
一, 指针引用错误。现代操作系统中普通使用虚拟存储器系统,使得每个进程可以使用的地址空间达到2^N,N为机器的位数,但是实际中并不需要如此大的内存,所以如果间接将引用的指针指向一块没有使用的内存空间中,操作系统会会报出segment error错误。int val;scanf("%d" , val);很明显上面scanf的使用是错误的,正确的做法应该是将val的地址传给scanf,但此却原创 2012-02-23 10:54:01 · 3412 阅读 · 0 评论 -
C/C++/CPP中与虚拟存储器(指针)有关错误汇总(二)
首先参考 C/C++/CPP中与虚拟存储器(指针)有关错误汇总(一)6. 错误指针地址运算指针的算法运算是以他们指向对象的大小为单位来进行运算的,例如整形指针pval, 如果求当前指针指针整数的下一个整数只需要int * pnext = pval + 1,很多对指针不熟悉的人可能会int *pNext = pVal + sizeof(int),从而造成错误。7. 引用不存原创 2012-02-23 21:24:12 · 3829 阅读 · 0 评论 -
矩阵乘法的并行算法
设两个矩阵A和B,大小分别为M * N 和 N * P, 如果C = A * B, 则C的大小为M * P。矩阵算法的算法表示,伪代码如下:for (i = 0; i < M; ++i){ for (j = 0; j < P; ++j){ C[i][j] = 0; for (k = 0; k < N; ++k){ C[i][j] += A[i][k] * B[k][j];原创 2012-02-15 10:16:30 · 21855 阅读 · 1 评论 -
C++中强制类型转换的应用
1.1 强制类型转换大家都知道在C语言里强制类型转换的方法非常简单,只要在要转换的变量前用括号确定要转换的类型即可,如要将一个double型的变量强制转换为int类型,代码如下: double x = 3.14; int y = (int)x;另外,还可有更高级的转换,如把int *类型的变量转换为int ,代码如下: int x = 20; int原创 2012-02-14 21:22:41 · 5622 阅读 · 0 评论 -
cpp不区分大小写比较字符串string
int StrCaseCmp(const string & stra , const string & strb){ int aLen = stra.length(); int bLen = strb.length(); int iRes = 0 , iPos = 0; for (iPos = 0; iPos < aLen && iPos < bLen; ++iPos) { iRe原创 2012-02-21 18:15:54 · 6275 阅读 · 0 评论 -
指针和Map
请看下面段代码,首先请猜测一下是否正确。 map pMap ; int A[100]; for(int i=0;i<100;i++){ *(A+i) = i; pMap[A+i] = A[i]+1; }怎么样,看下来有点眼花缭乱吧,究竟这个pMap里面存放的是什么呢?为了搞清楚这个问题,我们还是要从指针入手。搞清楚什么是指针,指针里存放的是什么内容。指针是指向一块内存原创 2012-02-12 16:12:28 · 5848 阅读 · 0 评论