1.istreambuf_iterator的用法:
可以像istream_iterator一样使用istreambuf_iterator,但istream_iterator<char>对象使用operator>>来从输入流中读取单个字符。istreambuf_iterator<char>对象进入流的缓冲区并直接读取下一个字符。更明确地说,一个istreambuf_iterator<char>对象从一个istream s中读取会调用s.rdbuf()->sgets()读s的下一个符。不忽略任何字符的读取例子:
ifstream inputFile("interstingData.txt");
string fileData((istreambuf_iterator<char>(inputFile)), istreambuf_iterator<char>());
2.back_inserter、front_inserter和inserter的用法:
int transmogrify(int x);
vector<int> values; // 把数据放入results
......
vector<int> results
transform(value.begin(), values.end(), back_inserter(results), transmogify); // 在results的结尾插入返回的values
在内部,back_inserter返回的迭代器会调用push_back,所以可以在任何提供push_back的容器上使用back_inserter(任何标准序列容器:vector、string、deque、list)。如果让一个算法在容器的前端插入东西,可以使用front_inserter。在内部,front_inserter利用了push_front,所以front_inserter只和提供那个成员函数的容器配合(deque和list)。
inserter允许你强制算法把它们的结果插入容器中的任意位置:
transform(value.begin(), values.end(), inserter(results, results.begin() + results.size()/2), transmogify);
3.真的想删除东西就在类似remove的算法后接上erase:
从容器中除去一个元素的唯一方法是调用那个容器的一个成员函数。而remove算法接收指定化操作的元素区间的一对迭代器,因为没有办法从一个迭代器获取对应于它的容器,所以remove不可能发现容器,所以remove不可能从一个容器中除去元素。
remove的操作结果:从一个容器中remove元素不会改变容器中元素的个数。
所以一般用算法remove和成员函数erase结合来真下删除元素,但list的成员函数是例外,但整合了2者。另外unique与remove类似的行为特性。
4.可适配的函数对象和不可适配的函数对象。
一些组件要求一些typedef有效,提供这些必要的typedef的函数对象称为可适配的,而缺乏那些typedef的函数对象不可适配。四个标准函数适配器(not1、not2、bind1st、bind2nd)都需要存在某些typedef,一些非标准STL兼容的适配器(比如来自SGI和Boost的)也需要。可适配的比不可适配的函数对象可以用于更多的场景,所以只要能做到就应使函数对象可适配。
规则:传给unary_function或binary_function的非指针类型都去掉了const和引用。用于带有或返回指针的仿函数的一般规则是传给unary_function或binary_function的类型是operator()带有或返回的类型。
5.
STL里的一个普遍习惯:函数和函数对象总使用用于非成员函数的语法形式调用。
因此,mem_fun和mem_fun_ref存在是为了让成员函数使用调用成员函数的语法来处理。
6.
条款45,count和find是线性时间的,但有序区间的搜索算法(binary_search、lower_bound、upper_bound和equal_range)是对数时间的。
从无序区间迁移到有序区间导致了另一个迁移:从使用相等来判断两个值是否相同到使用等价来判断。
7.条款49:
在一个const成员函数内部,类的所有非静态数据成员都变成常量!