直接上结论:deque的insert_aux中插入开始会push back或front一个和最末尾或最前面值相同的值是为了看是否需要扩充deque内存,选这个值应该是顺手。
stl中deque的实现是通过一个存储指向各个存储区域指针的map(注意就是个指针地图,不是stl的map数据结构),里面再指向对应区域去存储实际的内容来实现的。
这里deque的一些常见操作,如earse,clear,push那些的细节侯捷的stl源码解析中已经讲得很清楚了。没看的网上也有直接把书里面全篇复制来的,如:
https://blog.csdn.net/yl_puyu/article/details/103361874 可以直接看这。
这里是针对stl源码解析中insert_aux中的一段,进行说明:
template <class T, class Alloc, size_t BufSize>
typename deque<T, Alloc, BufSize>::iterator
deque<T, Alloc, BufSize>
::insert_aux(iterator pos, const value_type& x) {
difference_type index = pos - start; // 插入点之前的元素个数
value_type x_copy = x;
if (index < size() / 2) { // 如果插入点之前的元素个数比较少
push_front(front()); // 在最前端加入与第一元素同值的元素
iterator front1 = start; // 以下标示记号,然后进行元素移动
++front1;
iterator front2 = front1;
++front2;
pos = start + index;
iterator pos1 = pos;
++pos1;
copy(front2, pos1, front1); // 元素移动
}
else { // 插入点之后的元素个数比较少
push_back(back()); // 在最尾端加入与最后元素同值的元素。
iterator back1 = finish; // 以下标示记号,然后进行元素移动
--back1;
iterator back2 = back1;
--back2;
pos = start + index;
copy_backward(pos, back2, back1); // 元素移动
}
*pos = x_copy; // 在插入点上设定新值
return pos;
}
书里的中对于insert_aux
在前半或选择后半进行copy时,都会进行一个加入同值元素的操作,这里并没有解释清楚为什么这么干,只是注释中说了: 在最尾端加入与最后元素同值的元素。
这里通过copy_backward来实现插入,并尽量选择移动元素少的,来降低插入开销。
然而,插入一个同值元素,主要就是为了提前看是否需要扩充内存,因为本处是insert操作,如果预先留存空间不足会引起扩充。
本文主要是为了记录一些看stl源码解析中一些操作的理由。