title: 为什么STL的很多container的rangeversioninsert函数实现都有inputiterator和forwarditerator两个重载？
desc: 我的疑惑来自于Effective STL的第五条规则中的一句话，原文是：<br>A range insert function can move an element into its final position in a single move only if it can determine the distance between two iterators without losing its place. This is almost always possible， because all forward iterators offer this functionality.<br><br>我翻阅了microsoft的vector和list的实现，发现insert的实现的确为input iterator和forward iterator都单独做了实现。但是我不能理解这样设计的原因：以list为例，实现range insert的内部函数Insertrange的input iterator和forward iterator重载几乎没有区别。那么为什么要专门针对这两个不同的迭代器各做一个单独的实现呢？
topic: 编程
content: 以vectorinsertconstiter where， iter first， iter last为例，如果参数为forwarditer，则可以多次遍历访问。先用一次遍历访问求出待插入元素个数，预分配好内存，就可以减少内存分配的开销。而inputiterator只能访问一次，不能预先计算出待插入的元素个数，只能逐个插入，可能带来多次内存分配，开销增大。同理在用distance求元素个数的时候又有针对forwarditer和randomaccessiter的不同重载，也是效率考量使然。forwa
answerer_tags: 北美码农