为什么要使用区间函数:
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