Liangjf

The darkest hour is that before the dawn.

《Effective STL》

23《考虑用排序的vector替代关联容器》

条目二十三《考虑用排序的vector替代关联容器》 在看到这个条目的标题的时候,说实话,我一下子是比较懵逼的。这个结论怎么和数据结构的时间复杂度不一致了? 一般来说,像map,set等关联容器的底层因为是红黑树结构,那么即使红黑树的时间复杂度并非是绝对的对数时间,但也是稳定的接近对数时间。 然而类似vector这种序列容器的时间复杂度是线性的。 所以在涉及到对数据有查找操作的时候,在...

《Effective STL》

21《总是让比较函数在等值情况下返回false》

条目二十一《总是让比较函数在等值情况下返回false》 这条目对序列容器是不适合的,因为序列容器就是通过等值判断来比较的。 对于关联容器来说,比较是等价比较,所以要注意等值的时候,比较子的返回值。 关联容器的find、insert等都是通过等价来判断元素是否已存在的。 注意关联容器的等价表达式if(!(except1)&&!(except2))。如果是等值判断返回是t...

《Effective STL》

22《切勿修改set或multiset的键》

条目二十二《切勿修改set或multiset的键》 所有的标准关联容器一样,set和multiset按照一定的顺序来存放自己的元素,而这些容器的正确行为也是建立在其元素保持有序的基础之上的。如果你把关联容器中一个元素的值改变,那么元素在容器的位置就被破坏。 对于map和multimap来说,这应该是比较容易在编码期就能发现问题的。因为它们的模板类型是pair<K, V>...

《Effective STL》

20《为包含指针的关联容器指定比较类型》

条目二十《为包含指针的关联容器指定比较类型》 stl中的关联容器是一种动态数据结构,其数据存储方式是以内存节点方式的数据结构,具体来说一般是一种平衡二叉树(红黑树),在向关联容器插入元素的时候,容器内部为了保持树的平衡性,会自动(插入函数有自我调整代码)的调整当前插入元素的存储位置,达到动态平衡的目的。 所以在关联容器存储的是指针的时候,如果是采用默认的比较对象,那么由于是指针,那么整个...

配置Lua运行环境

SublimeText3配置Lua运行环境

SublimeText3配置Lua运行环境 前言 要问现在哪个编译器最能扛得住潮流,要数Sublime Text3了,由于它的轻量,插件丰富,美观,造就了一大批粉丝(本菜鸡也是哦) 在以前的工作中使用惯了Sublime Text3,由于转行做游戏开发了,涉及到lua脚本的开发,因此马上把Sublime Text3配置成lua运行环境。 搭建步骤 1.下载安装Sublime Text3...

《Effective STL》

19《了解相等和等价的区别》

条目十九《了解相等和等价的区别》 在stl标准库中,find和insert两个操作都涉及到对数据的比较。但是他们是两种不同的比较,前者是基于相等(基于operator==,表达式if(x == y)),后者是基于等价(基于if(!x<y && !y<x))。 对于相等,注意的地方: 对于同一个容器,基于不同比较操作,得到的结果可能是不一样的。 对于...

《Effective STL》

18《避免使用vector

条目十八《避免使用vector》 先说结论: 一是:vector<bool>不是标准容器,因为标准容器的对于T *p = &c[0];必须是可编译的。 二是:vector<bool>并不是以单个元素为bool来存储的。 在底层实现中,vector<bool>中为了节省空间,bool并不真的是以单个字节来存储的,而是通过位bit来表...

《Effective STL》

17《使用“交换技巧”来修整过剩容量》

条目十七《使用“交换技巧”来修整过剩容量》 先说原理: 创建一个临时容器,把容器拷贝到临时容器,借用拷贝构造函数只对原容器有效元素拷贝而忽略多余的空间,然后再把临时容器和原容器的内容互相交换,就达到容量尽可能修剪的目的。 记住!!!是尽可能修剪。因为容器,比如vector在底层的实现可能是2的倍数这样分配内存的,所以会保持2的倍数的最小内存的容量。 看例子吧。 vector&...

《Effective STL》

16《如何将vector和string的数据传给遗留的API》

条目十六《如何将vector和string的数据传给遗留的API》 优秀的代码是可以延续的,所以并非所有的代码都是重构的,而且有时候重构会对整个系统影响较大,投入巨大,得不偿失。然而,也不必为了系统的稳定而抛弃先进和方便的技术。 正如如果你想在遗留的老代码中想传vector和string给形参是数组的接口,那么可以按以下的方法做: 接口:void dosomething(const c...

《Effective STL》

15《注意strng实现的多样性》

条目十五《注意strng实现的多样性》 下面以一个打印string空对象的大小切入本条目: #include #include using namespace std; int main() { string ss; printf("ss size: %ld\n", sizeof(ss)); return 0; } ss size: 32...