苔花如米小,也学牡丹开。
为局部变量初始化是一个好的习惯
为只有“一条语句”的代码段使用大括号括起来
#define FAIL(msg)\
std::ostringsteam oss;\
oss << msg;\
throw exception(oss.str());
if (y == 0)
FAIL("除数不能为0")
这里的FAIL("除数不能为0")
看似是一条语句其实是多条语句,在不使用化大括号的情况下,if
的势力范围只有一条语句,对本例而言,也就是std::ostringstream oss;
。这时编译器就会报错,无法识别oss
。
简单的双分支if判断可以改造为三目运算符
if (x % 2 == 0)
{
return true;
}
else
{
return false;
}
改写为:
return x % 2 == 2 ? true : false;
思维上视boost::shared_ptr<T>类型对象的“真正”类型为T*
思维上视boost::shared_ptr<T>
的真正类型为T*
,这样可减少思维的转换过程。邹欣老师说过,要把智力消耗在真正值得思考的事情上去,而不是低层次的仅靠记忆便可解决的事情上来。
操纵boost::shared_ptr<T>
类型对象如同操纵T*
。中间不必做任何任何思维和行为上的转换。不仅如此,boost::shared_ptr<T>
能够在必要的时刻对创建在heap
上的对象做销毁操作。
protected
vs private
一般而言用于继承关系的基类或者存在virtual
函数的基类,它们的成员变量是protected
修饰的,不做为基类或者说不存在virtual
函数的基类,它们的成员变量都是private
的。道理很简单,被protected
修饰的成员变量,可以继续被派生类访问。
牵涉到元素的拼接时,优先选用的容器是list
在所有的容器中,只有list具有把元素从一处链接到另一处而不需要拷贝任何数据的能力
list的客户之所以选择使用list,也恰是因为它提供了高效的链接(splice)操作,对应与list的成员函数
splice
何谓高效:把一个区间从一个list链接到另一个list可通过常数时间完成。
list的splice成员函数可以将list2的任意区间的元素链接到list1的任意一个位置(作为起始处)
int main(int, char**)
{
list<int> l1{0, 1, 2, 3, 4}, l2(l1);
// l2的[2, 4]之间的所有元素链接到l1的末尾
l1.splice(l1.end(), l2, find(l2.begin(), l2.end(), 2),
find(l2.rbegin(), l2.rend(), 4).base());
// l2的[2, 4]之间的所有元素链接到l1元素为3的位置之前
l1.splice(find(l1.begin(), l2.end(), 3), l2,
find(l2.begin(), l2.end(), 2), find(l2.begin(), l2.end(), 4));
return 0;
}