随笔分类 - C/C++
摘要:二叉树遍历的三种递归遍历的方法都比较直观,这里说一下他们的三种非递归遍历的方法。一.先序遍历的非递归算法 1.栈stack初始化 2.循环直到栈stack为空且p为空 (1)如果p非空则 a.访问p所指的当前根节点; b.将p值保存到栈stack中; c.将p指向其左子树的根节点,继续遍历其左子树; (2)如果p为空则 a.从栈stack中退出元素赋给p,回溯至父亲节点 b.将p指向其右子树的根节点,继续遍历右子树二.中序遍历的非递归算法 1.栈stack初始化 2.循环直到栈stack为空且p为空 (1)如果p非空则 a.将p值保存到栈stack中 b.将p指向其左子树的根节点,继续遍历其.
阅读全文
摘要:1.在编程珠玑中如果一个待排序的数组有这样三个属性:输入数据限制在相对较小的范围内;数据没有重复;而且对于每条记录而言,除了单一整数外,没有任何其他关联数据。就可以用位图来排序。 在32的系统下用unsigned int a[]的数组来表示位图,那么a[0]就可以表示0-31这32个整数了,如果在待排序的数组中出现了这几个数,就把相应的位置1,。 void bit_set(unsigned int...
阅读全文
摘要:topK问题就是在很多个无序的数之间选出前最小(大)的K个数,对于这种问题可以建立K大小的堆,如果是求K大个数的话,就建立最小堆,反之求最小个数的话就建最大堆。然后再遍历这个无序数组,如果遇到比堆顶元素大,就移除堆顶元素,把大的那个元素加入堆,反之亦然。 代码如下:#include#include#include#include#includeusing namespace std;template inline void print(const vector& cala){ typename vector::const_iterator first = cala.begin(); f
阅读全文
摘要:堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: 1.堆中某个节点的值总是不大于或不小于其父节点的值; 2.堆总是一棵完全树。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。" ki=k2i,ki>=k2i+1.(i=1,2,…,[n/2])"若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所
阅读全文
摘要:c语言中的宏定义,有着各种好处,当然也有它不好的一面。它实现的三个主要功能是: 1)字符串替换 2)头文件包含 3)通用代码模块的扩展在代码调试时候,调试宏定义是比较麻烦的一件事,下面就介绍一种比较简单的方法。#include#define max(a, b) ((a) > (b) ? (a) : (b))#define min(a, b) ((a) < (b) ? (a) : (b))int main(void){ int a = 66; int b = 88; int ret; ret = max(a, b); printf("ret is %d\n", .
阅读全文
摘要:所谓仿函数,是定义了operator()的对象,下面这个例子:FunctionObject fo; fo();其中表达式fo()是调用仿函数fo的operator()。而非调用函数fo().你可以将仿函数看做一般函数,只不过用的是一种更复杂的撰写手段:并非将所有语句放在函数体中:void fo() { statements;}而是在仿函数类别的operator()体内撰写程序代码。class FunctionObject { public: void operator() { ...
阅读全文
摘要:在c++中,类与类之间有某些语义关系,这种关系是演化的结果,某些类的成员函数勇用于改善其特性,或者特化已有基类的某些特性,而对其余的特性加以继承。继承可以使基类的某些特性充分的得到可重用。但在某些时候处理不好的话,会带来一些编译错误。如下面的代码:#include<iostream>using namespace std;class Base { public: virtual void fucA(void) = 0; virtual void fucA(int ); void fucB(); void fucC(); ...
阅读全文
摘要:最近又重新开始学c++了,才逐渐认识到c++的强大,原来自己一直都是一个小菜鸟。今天在学find这个泛型算法的时候,又遇到了一个有趣的问题,故写下来了。先贴上代码吧#include<iostream>#include<string>#include<list>#include<algorithm>#include<iterator>#include<string>using namespace std;template <typename InputItera, typename T >inline Input
阅读全文
摘要:上个星期参加了腾讯的实习生面试,非常不幸的在第三面的时候被挂掉了。 今天在看源码的时候看见一个字符串比较的函数,类似于int strcmp(const char *s1,const char * s2),因为参见腾讯二面的时候写过这个函数,所以又仔细的想了一下,感觉这个代码的效率要高点,但自己写的时候也出现的了一些问题。先看有问题的代码:#include<stdio.h>#include<assert.h>int tcstricmp(const char *astr, const char *bstr, size_t n){ assert(astr &&
阅读全文
摘要:1.对齐的原因 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况, 但是最常见的是如果不按照适合其平台的要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为 32位)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低 字节进行拼凑才能得到该int数据。显然在读取效率上下降很多。这也是空间和时间的博弈。2.对齐的实现 编译器对数据存放做了对齐,平常我们在写程序的时候都
阅读全文

浙公网安备 33010602011771号