Jian's Note
It's better to burn out than fade away!
把const_iterator转化为iterator 有些容器成员函数只接受iterator作为参数,而不是const_iterator。如果你只有一个const_iterator,要在它所指向的容器位置上插入新元素呢? 上一条款说并不存在从const_iterator到iterator之间的隐式转换,
4种迭代器 每个标准容器类都提供4种迭代器类型:iterator,const_iterator,reverse_iterator和const_reverse_iterator 对于container<T>而言,iterator的作用相当于T*,而const_iterator则相当于const
STL没有散列表。 兼容STL的散列关联容器可以从多个来源获得,而且它们甚至有事实上的标准名字:hash_set、hash_multiset、hash_map和hash_multimap。在C++标准委员会的议案中,散列容器的名字是unordered_set、 unordered_multiset、un
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[]函
当需要一个提供快速查找的数据结构时,很多STL程序员立刻会想到标准关联容器:set、multiset、map和multimap。 如果使用了合适的散列函数,则可以认为散列容器提供了常数时间的查找。 对于多数应用,被认为是常数时间查找的散列容器要好于保证了对数时间查找的set、map和它们的multi同事
所有标准关联容器,set和multiset保持它们的元素有序,这些容器的正确行为依赖于它们保持有序。 如果你改了关联容器里的一个元素的值(例如,把10变为1000),新值可能不在正确的位置,而且那将破坏容器的有序性。 修改map和multimap值 试图改变这些容器里的一个键值的程序将不能编译: 1 2 3 4 5
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}$是
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 实际运行
比较对象 STL充满了比较对象是否有同样的值。比如,当你用find来定位区间中第一个有特定值的对象的位置,find必须可以比较两个对象,看看一个的值是否与另一个相等。同样,当你尝试向set中插入一个新元素时,set::insert必须可以判断那个元素的值是否已经在set中了。 find算法和set的in
vector 问题 作为一个STL容器,vector确实只有1个问题: 它不是一个STL容器; 它并不容纳bool。 剖析 一个东西要成为STL容器就必须满足所有在C++标准23.1节中列出的容器必要条件。 如果c是一个T类型对象的容器,且c支持operator[],那么以下代码必须能够编译: 1 T *p = &c[0]; // 无论operato