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源码解析中一些操作的理由。

posted @ 2024-02-22 17:39  zzzlight  阅读(11)  评论(0编辑  收藏  举报