区间成员函数优先于与之对应的单元素成员函数

优先选择区间成员函数而不是其对应的单元素成员函数有三条充分的理由:

(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的内在内存。这个节省相当可观。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值