①关于NULL&nullptr(C++11):
当涉及空指针判断时,写nullptr可以避免二义性,因此更好
(一)nullptr与NULL的区别
1. NULL是一个宏定义,C++中通常将其定义为0,编译器总是优先把它当作一个整型常量(C标准下定义为(void*)0),但是也可以被看作整型常量0,所以在函数传参等时容易引起二义性
2. nullptr是一个编译期常量,其类型为nullptr_t。它既不是整型类型,也不是指针类型。
3. 在模板推导中,nullptr被推导为nullptr_t类型(是个类似于vector等的类?),仍可隐式转为指针。但0或NULL则会被推导为整型类型。
4.要避免在整型和指针间进行函数重载。因为NULL会被匹配到整型形参版本的函数,而不是预期的指针版本,除非你传参是nullptr
(二)nullptr与(void*)0的区别
1. nullptr到任何指针的转换是隐式的。(尽管nullptr不是指针类型,但仍可当指针使用)
2.(void*)0只是一个强制转换表达式,其返回void*指针类型,只能经过类型转换到其他指针才能用。
②层序遍历中严格一层层地来遍历的经典处理:
③常数次遍历的处理思想:
也就是说,往往这种从O(n2)的复杂度优化到O(n)形式,也就是修正为常数次遍历的处理,都是集中于“变化”来看的;O(n2)的处理,更像是枚举所有的情况种类,但是每一种情况都要重新计算它的值;而O(n)的处理,是先通过一次遍历得到一个“基准值”,然后在第二次遍历中,对于每个分割点所引起的变化,不断在基准值的基础上更新值的大小——也就是O(n2)是重新计算,而O(n)是借助前人来作微调
④一些杂碎的整理:
(1)s.substr(起始位置下标,长度)返回一个临时值,也就是右值
(2)初始化max&min一类的参量的便捷方法--INT_MAX&INT_MIN&LONG_MAX&LONG_MIN&LLONG_MAX&LLONG_MIN
(3)位运算的优先级要低于四则运算!!!!!!!!于是在使用位运算来进行更快捷的除以2的运算时,这样写是不符合预期结果(先除以2再加left)的:
于是第761行应当修改为:
int q=((right-left)>>1)+left;
(4)二分寻找插入位置时的初始化技巧:(如果比所有的都大就插在最右边)
ans初始化位置位于最右侧的好处即是当寻找不到比它大的元素时,能够正好插入到最右侧
(5)std::accumulate:头文件<numeric>,同样地,除了标准库容器,普通数组也可以使用:
vector<int>arr{1,2,3};
std::accumulate(arr.begin(),arr.end(),0);
int arr[3]={1,2,3};
std::accumulate(arr,arr+3,0);
(6)好活:生成每种字符都是奇数个的字符串:
(7)隐式贪心思想:
在柠檬水找零的过程当中,很明显5块的比10块的更有用,因此优先花出去10块的思想,就是贪心思想: