1、C++动态二维数组声明:
int** a2 = new int*[rows];
for(int i=0;i<rows;i++)
a2[i] = new int[columns];
2、scanf遇到空格会结束。(%s也是)
但最后的空格、换行等会留在缓冲区。
3、qsort使用stdlib.h,其中的sizeof()中填数组类型。
qsort(数组名,元素个数,元素类型所占空间,排序函数);
Cmp函数,返回值为负则不交换。
int cmp(const void*,const void *)
{
}
c++的sort函数,cmp则为bool型,且返回值为正则不交换。(若要对结构体进行排序,最好在形参位置加上引用,否则调用时会复制结构体,开销较大)
4、无特殊说明,默认每行输出后都带\n。
有多组数据,每组后面要加\n分开。
5、三者都是从标准输入流stdio (标准输入设备,一般指向键盘)中读取内容。
scanf输入字符串的时候不会接收Space空格,回车Enter,Tab键;均认为输入结束。
gets能接收空格键,回车键,Tab键;回车则认为输入结束
getchar只能接受一个字符,遇到回车结束输入,可接受回车键。常用来吸收回车符。
6、获得字符串匹配位置:
Strstr()获得指针后,减去原指针。
7、strcpy函数,第一个参数char *des,不能是一个未分配空间的指针(如char *p)。
scanf输入%s时,也不能是一个未分配空间的指针。
8、c语言和C++在使用结构体的时候,定义变量方式不同:c++可以当做类名直接定义,而C语言需要在定义时,前面加上struct关键字(若使用typedef则不需要):
struct Book book;
9、不同编译器,对p = (i++) + (i++)的执行结果不同,vc6中p是两个i的原值的和;而dev c++中,第二个i是已经自增过的i。
为保险起见,不要出现这种同一行语句中出现同一变量的多次自增自减操作。
10、c语言定义指针数组,若此数组是全局变量,则默认初始化为空指针,若是局部变量,则为随机值。
11、c语言结构体定义方法:
typedef struct node
{
int data;
struct node* lchild;
struct node* rchild;
}Node,*Tree;
这样定义,使用时不需再加struct关键字,且需要定义结构体指针时也不需加*符号(如直接Tree root; 定义的root是一个指针)。
注:不可以在结构体结束处直接Node[const],需要另外定义。(C++可以这样)
12、c语言二叉树建树,若是边建树边新建结点,则函数形参需要是双指针,并且在传参时,需要传引用:
void insert(Node** root,int data)
insert(&root,temp);
若是c++,则可以直接定义形参为指针的引用:
void insert(Node* & root,int data)
insert(root,temp);
13、c/c++给数组初始化时,规则为,数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值:
int a[5] = { 1 }; //标准C/C++只有第一个元素赋值为1,其他都为0.
14、c语言memset,数组置零:
memset(a,0,n*sizeof(a));
其中n是数组长度,若是二维数组,则再乘n。
15、c++ vector迭代器用法:
for(vector<int>::iterator iter = a.begin();iter != a.end(); ++iter)
{
cout << *iter << endl;
}
利用iterator寻找相同的vector元素 :
it = find(v1.begin() , v1.end() , v2[i]);
if(it != v1.end()) //it与v1.end()相等说明没找到
...
16、求解树的LCA以及路径合并:
void LCAmerge(vector<int> path1,vector<int> path2,int target)
{
vector<int> path;
vector<int>::iterator it;
for(int i = path1.size()-1;i>=0;i--)
{
it = find(path2.begin(),path2.end(),path1[i]);
if(it != path2.end())
{
for(int j = path1.size()-1;j>i;j--)
{
path.push_back(path1[j]);
}
for(it;it != path2.end();it++)
{
path.push_back(*it);
}
break;
}
}
for(int p = 0;p<path.size();p++)
{
printf("%d ",path[p]);
}
printf("%d\n",target);
return;
}
17、二维数组初始化为非0值:
#define MAXN 1000
int G[MAXN][MAXN];
fill(G[0],G[0] + MAXN*MAXN,10000);
18、若使用int *p;的方式定义数组,则传参时是按照指针来处理;解决办法是传引用。否则想要获取数组长度时,sizeof(p)/sizeof(int)永远是1。
19、整数转char字符串:使用sprintf,第一个参数是要存入的char数组,第二个参数是格式(参考printf),第三个参数是需要转换的原始数据。
sprintf(str , "%d" , N);
20、c++11以下的标准不允许map直接使用大括号初始化,只能用insert或一个一个初始化。
map<int , char *> m;
m[1] = "one";
21、输出浮点数保留一位小数:
printf("%.1f",x);
22、太可怕了。qsort在处理结构体时有时会出玄学错误,里面的成员变量在排序后会乱码。保险起见还是用sort吧!
23、不要用fflush(stdio)来清除输入缓存,它不是标准函数。写题时想要吃掉\n,直接用getchar()即可。