Jian's Note

It's better to burn out than fade away!

Effective STL [24] | 当关乎效率时应该在map::operator[]和map-insert之间仔细选择

Example map插入 假设有一个支持默认构造函数以及从一个double构造和赋值的Widget类: 1 2 3 4 5 6 7 class Widget { public: Widget(); Widget(double weight); Widget& operator=(double weight); ... } 假设我们想建立一个从int到Widget的map,而且我们想有初始化有特定值的映射: 1 2 3 4 5 6 map<int, Widget> m; m[1] = 1.50; m[2] = 3.67; m[3] = 10.5; m[4] = 45.8; m[5] = 0.0003; map operator[] 工作原理 map的operator[]函

Effective STL [23] | 考虑用有序vector代替关联容器

当需要一个提供快速查找的数据结构时,很多STL程序员立刻会想到标准关联容器:set、multiset、map和multimap。 如果使用了合适的散列函数,则可以认为散列容器提供了常数时间的查找。 对于多数应用,被认为是常数时间查找的散列容器要好于保证了对数时间查找的set、map和它们的multi同事

Effective STL [22] | 避免原地修改set和multiset的键

所有标准关联容器,set和multiset保持它们的元素有序,这些容器的正确行为依赖于它们保持有序。 如果你改了关联容器里的一个元素的值(例如,把10变为1000),新值可能不在正确的位置,而且那将破坏容器的有序性。 修改map和multimap值 试图改变这些容器里的一个键值的程序将不能编译: 1 2 3 4 5

Effective STL [21] | 永远让比较函数对相等的值返回false

Example set 建立一个set,比较类型用less_equal,然后插入整型数字33(称为 $33_{A}$): 1 2 set<int, less_equal<int> > s; // s以“<=”排序 s.insert(33); // 插入33 现在尝试再插入一次33(称为 $33_{B}$): 1 s.insert(33); 对于这个insert的调用,set必须先要判断出 $33_{A}$ 是否已经位于其中了,查找哪儿适合插入 $33_{B}$。最终,它总要检查 $33_{B}$是

Effective STL [20] | 为指针的关联容器指定比较类型

Example 假定你有一个string*指针的set,你把一些动物的名字插入进set: 1 2 3 4 5 6 set<string*> ssp; ssp.insert(new string("Anteater")); ssp.insert(new string("Wombat")); ssp.insert(new string("Lemur")); ssp.insert(new string("Penguin")); // ssp = “set of string ptrs” 然后你写了下列代码打印set的内容,希望字符串按字母顺序出现。毕竟,确定set保持它们的内容有序。 1 2 3 for (set<string*>::const_iterator i = ssp.begin();i != ssp.end();++i) { cout << *i << endl; } 你期望看到 1 2 3 4 Anteater Wombat Lemur Penguin 实际运行

Effective STL [19] | 了解相等和等价的区别

比较对象 STL充满了比较对象是否有同样的值。比如,当你用find来定位区间中第一个有特定值的对象的位置,find必须可以比较两个对象,看看一个的值是否与另一个相等。同样,当你尝试向set中插入一个新元素时,set::insert必须可以判断那个元素的值是否已经在set中了。 find算法和set的in

Effective STL [18] | 避免使用vector<bool>

vector 问题 作为一个STL容器,vector确实只有1个问题: 它不是一个STL容器; 它并不容纳bool。 剖析 一个东西要成为STL容器就必须满足所有在C++标准23.1节中列出的容器必要条件。 如果c是一个T类型对象的容器,且c支持operator[],那么以下代码必须能够编译: 1 T *p = &c[0]; // 无论operato
0%