Effective STL - 03 - Iterator
Iterator
条款26:尽量用iterator代替const_iterator,reverse_iterator和const_reverse_iterator
1 | graph |
iterator 能够比 const_iterator 有更好的泛化性能,特别是对于 insert 、erase 函数,他们只支持 iterator 而不支持 const_iterator。
我们已经有足够的理由相信应该尽量使用iterator取代const或者reverse类型的迭代器:
- insert和erase的一些版本要求iterator。如果你需要调用这些函数,你就必须产生iterator,而不能用const或reverse iterators。
- 不可能把const_iterator隐式转换成iterator,我们将会在条款27中讨论从一个const_iterator产生一个iterator的技术并不普遍适用,而且不保证高效。
- 从reverse_iterator转换而来的iterator在转换之后可能需要相应的调整,在条款28中我们会讨论何时需要调整以及调整的原因。
条款27:用distance和advance把const_iterator转化成iterator
1 | vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; |
条款28:了解如何通过reverse_iterator的base得到iterator
1 | vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; |
总结:**ri.base() 永远返回指向 ri 的正向下一个元素。因此,对于 逆向的 insert 来说,插入刚好发生在 ri 的逆向上一个元素;对于 逆向的 erase 来说,删除刚好发生在 ri 的逆向上一个元素,并不像 iterator 那样删除本身**。
条款29:需要一个一个字符输入时考虑使用istreambuf_iterator
1 | // 使用 istream_iterator |
使用 istreambuf_iterator 比 istream_iterator 快了大约一半。
istream_iterator 使用了 operator>> 来读取输入,因此能够设置模式化读入;istream_iterator 使用了 cin.getchar() 读取,所以对于读取单个的字符会更快。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Yet Another 何榜文's Blog!