c++ 自己遇到的编程陷阱或技巧

技巧

1.获得类中属性的引用 (比如kaldi中的matrix,重载了(),返回值是个引用,就可以实现 ()= 的效果了)

int &Cls::cite(){
	return b; //b in Cls
}

2.define中#的作用,对宏参数进行字符化操作。及其他有用的宏命令

#define FUN(fun) \
cout<<#fun<<endl;
FUN(fun(123));  //会输出 fun(123) 

#pragma message("this is message ")  //编译器输出打印信息,但是不退出。  可以用来检查头文件的调用
# error ("Error")   //直接退出

3.检测Nan,inf

检测nan用 a==a ,如果是a=nan,则上式不成立。
检测inf,如果有boost,则先引用头文件
#include </usr/include/boost/math/special_functions/fpclassify.hpp>
然后使用 isinf(a)

4 区间和桶数

int minv = *min_element(nums.begin(), nums.end());
int maxv = *max_element(nums.begin(), nums.end());
int d = max(1,(maxv - minv) / (n - 1));
int bucketSize = (maxv - minv) / d + 1;
vector< vector<int> > buckt(bucketSize, vector<int>(2, -1));

陷阱

1.map中最好放结构体的指针而不是结构体本身。自己做的 3D特效五子棋对战平台,当release的时候,存有结构体的map会报错。

猜测原因:在函数中生成结构体后,虽然装入到了map但是函数结束后会释放。 (不一定对,应为debug模式下没错)

2.map中边遍历,边删除一些key会报错。

自己用如下方式解决,(就是多设置了一个变量)

map <unsigned long long,pSamfmt>::iterator it_tp=it_fmt;
it_fmt++;
mp_fmt.erase(it_tp);
free(fmt);

3.使用strtok后会把原来字符串中指定的字符串变为0,所以最好用个副本。

pC=strtok(fmt->id,"_");
fmt->rd1=atoi(strtok(NULL,"_"));
fmt->rd2=atoi(strtok(NULL,"_"));

4.虚函数,应该只对使用指针时有用

void demo1(){//有效果 
	B *b=new B();
	A * a=b;
	a->f();
}
void demo2(){//加不加virtual都执行a中定义的函数 
	B b;
	A a=(A)b;//或者A a=b; 
	a.f();
}

5. stringstream 清空的问题

目前为止感觉.clear()没用需要用.str(“”) ,如果要转为char则需要.str().c_str();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值