1、C字符串是以‘\0’字符作为结束标志的
char *p="abcde\0fghjik\0"; printf("%d\n" , strlen(p)); //5 (a、b、c、d、e) char acNew[20]= "\\0\0"; printf("%d\n",strlen(acNew)); //2 (\和0)
2、构造函数和虚析构函数
#include "stdafx.h" #include <string> #include <iostream.h> class A { public: A(){cout<<"A Construct!"<<endl;} virtual ~A(){cout<<"A Destroy!"<<endl;} //虚析构函数 }; class B:public A { public: B(){cout<<"B Construct!"<<endl;} ~B(){cout<<"B Destroy!"<<endl;} }; int main(int argc, char* argv[]) { A *a1=new B; //A Construct! B Construct! delete a1; //B Destroy! A Destroy! A *a2=new A; //A Construct! delete a2; //A Destroy! B *b=new B; //A Construct! B Construct! delete b; //B Destroy! A Destroy! return 0; }
3、指针数组和指向数组的指针的区别
char *a[]={"abc","cde","fgh"}; //字符指针数组
char **b=a; //ok
int a[3][4];
int (*p)[4]=a; //ok,指向含有4个整型元素的一维数组的指针
int **p = a; //error
4、不要返回临时变量的引用
float &test(float a,float b)
{
float c=a*b;
returnc; //返回临时变量的引用,当函数结束后,该临时对象内存被释放掉,返回的引用变成空引用
}
5、const引用的特殊用处(const变量在编译期间就已经确定初始值了)
int a = 10;
double &test = a + 0.2; //error,不同类型的引用
const double &test = a + 2.0; //ok,const引用可用于不同类型之间
const int &ra=a;
ra=1; //error
a=1; //ok
void bar(string &s);
bar(“hello”); //error,试图将一个const 对象转换为非const
6、桶排序介绍
输入是由一个随机过程产生的[0, 1)区间上均匀分布的实数。
将区间[0, 1)划分为n个大小相等的子区间(桶),每个桶大小1/n:[0, 1/n), [1/n, 2/n), [2/n, 3/n),…,[k/n, (k+1)/n ),…,
将n个输入元素分配到这些桶中,对桶中元素进行排序,
按照顺序将各个桶中的元素列出来。
7、在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路
解法:首先假设是32位无符号整数。
1. 读一遍10G个整数,把整数映射到256M个区段中,用一个64位无符号整数给每个相应区段记数。说明:整数范围是0 - 2^32- 1,一共有4G种取值,映射到256M个区段(256M个桶),则每个区段有16(4G/256M = 16)种值,每16个值算一段, 0~15是第1段,16~31是第2段,……2^32-16 ~2^32-1是第256M段。一个64位无符号整数(计数)最大值是0~8G-1,这里先不考虑溢出的情况。总共占用内存256M×8B=2GB。
2. 从前到后对每一段的计数累加,当累加的和超过5G时停止,找出这个区段(即累加停止时达到的区段,也是中位数所在的区段)的数值范围,设为[a,a+15],同时记录累加到前一个区段的总数,设为m。然后,释放除这个区段占用的内存。
3. 再读一遍10G个整数,把在[a,a+15]内的每个值计数,即有16个计数。
4. 对新的计数依次累加,每次的和设为n,当m+n的值超过5G时停止,此时的这个计数所对应的数就是中位数。