stl源码解析,deque的insert_aux
直接上结论: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源码解析中一些操作的理由。