优先选择区间成员函数而不是其对应的单元素成员函数有三条充分的理由:
(1)区间成员函数写起来更容易;
(2)更能清楚地表达你的意图;
(3)表现出了更高的效率。
这里重点讨论效率问题:
比较向量里面insert函数的三个重载:
iterator insert( iterator _Where, const Type& _Val );//只在指定位置插入一个值 void insert( iterator _Where, size_type _Count, const Type& _Val );//在指定位置插入相同的_Count个值 template<class InputIterator> void insert( iterator _Where, InputIterator _First, InputIterator _Last );//在指定位置插入区间内的值
如果我们用while循环将指定区间内的N个对象用
第一个函数插入向量中,则_Where后面的数将向后移动N次,每次移一位。
但是如果我们用第三个函数则只要将_Where后面的数将向后一次性移动N位。
这还只是我们假定向量已经分配的内存空间足够我们插入N个对象的情况。
让我们来考虑得更深入一些:
假定我们的N为1000,而向量,只是初始化为零:vector<int> v;
当你试图去把一个元素插入内存已经满了的vector时,这个vector会分配具有更多容量的新内存,
从旧内存把它的元素拷贝到新内存,销毁旧内存里的元素,回收旧内存。
然后它添加插入的元素。大部分vector实现都使它们的容量翻倍,
所以插入numValues个新元素会导致最多log2numValues次新内存的分配。
所以每次一个地插入1000个元素会导致10次新的分配(包括它们负责的元素拷贝)。
与之对比的是(而且,就目前来看,是可预测的),
一个区间插入可以在开始插入东西前计算出需要多少新内存(假设给的是前向迭代器),
所以它不用多于一次地重新分配vector的内在内存。这个节省相当可观。