散列容器,单链表,rope和多种非标准函数对象。
虽然如此,一个有效的STL程序员需要知道这样的扩展,因此我在合适的地方提到了它们。重载了函数调用操作符(即,operator())的任何类叫做仿函数类。从这样的类建立的对象称为函数对象或仿函数。STL中大部分可以使用函数对象的地方也都可以用真函数,所以我经常使用术语“函数对象”来表示C++函数和真的函数对象。 函数bind1st和bind2nd称为绑定器。
通常,常数时间操作运行得比要求对数时间的快,而对数时间操作运行得比线性的快。当n变得足够大时,这总是真的,但对于n相对小的值,有时候更差理论复杂度的操作可能或胜过更好理论复杂度的操作。
我最喜爱的参数名中的有两个是lhs和rhs。它们分别代表“左手边”和“右手边”,而且当声明操作符时,我发现它们特别有用。class Widget { ... }; bool operator==(const Widget& Ihs, const Widget& rhs); 当这个函数在这样的场景下被调用时,if (x == y) ... // 假设x和y是Widget x,在“==”的左边,在operator==里面被称为lhs,而y被称为rhs。
条款4:用empty来代替检查size()是否为0
条款5:尽量使用区间成员函数代替它们的单元素兄弟给定两个vector,v1和v2,使v1的内容和v2的后半部分一样的最简单方式是什么?不要为“当v2有偶数个元素时才有一半”而烦恼,只要做一些合理的东西。时间到!如果你的答案是v1.assign(v2.begin() + v2.size() / 2, v2.end());
当你想要给一个容器完全的新数据集时,assign就可以利用,但operator=做不了。
v1.clear();
copy(v2.begin() + v2.size() / 2, v2.end(), back_inserter(v1));
这个copy的调用可以用一个insert的区间版本代替:
v1.insert(v1.end(), v2.begin() + v2.size() / 2, v2.end());
这个输入量稍微比调用copy少,但它发生的也比说的要直接:数据插入v1。调用copy也表达了那个意思,但没那么直接。
太多的STL程序员过度使用copy,所以我重复一遍我的建议:几乎所有目标区间被插入迭代器指定的copy的使用都可以用调用的区间成员函数的来代替。
返回我们的assign的例子,我们已经确定两个尽量使用区间成员函数代替它们的单元素兄弟的理由。
- 一般来说使用区间成员函数可以输入更少的代码。
- 区间成员函数会导致代码更清晰更直接了当。
简而言之,区间成员函数所产生的代码更容易写,更容易理解。不是这样吗?