区间成员函数的优势

为什么要使用区间函数:

v.insert(v.begin(),data,data+num);
//显示循环:
for(int i = 0 ;i < num;i++)
{
   insertLoc = v.insert(insertLoc,data[i]);
   ++insertLoc;
}

函数调用:

如果是区间函数,那么只需要一次函数;循环插入则需要n次insert的函数调用。


元素移动:

  • 循环单点插入:假设插入掉后面有n个点,那么每次插入都要移动n个元素,那么num个数据就是num * n的代价。
  • 区间函数:区间函数在插入的时候,会计算出后后面n个点的最终位置(也就是 当前位置cur+num),
    所以只需要n的代价。

插入的时候使用的拷贝构造(因为对象生存期问题),避免有的局部对象出现问题。


内存分配:

以vector为例,如果当前的空间满了,那么会重新分配一块内存,然后copy过去,再释放以前的内存。

  • 单点插入的话,num个元素最多导致 log2(num)次上述操作。
  • 区间插入的话就不需要重复的分配内存。

(对string同样有效,deque则因为内存管理不同,所以不适合该论断,但元素移动依然有效。)

--
list的 区间函数和单点函数之间的区别则设计到 指针的使用次数。

  • 区间:总共需要 (n-1) * 2 + 4 //n个点之间,以及最后和两边接轨
  • 单点:每次插入需要4次指针赋值, 总共就是4 * n的次数

(insert,erase,assign等)


参考:

effective STL

posted @ 2017-03-20 18:44  Przz  阅读(183)  评论(0编辑  收藏  举报