stl_vector::insert_aux方法原理

Posted 欢乐的企鹅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stl_vector::insert_aux方法原理相关的知识,希望对你有一定的参考价值。

stl_vector::insert_aux源码

template <class T, class Alloc>
void vector<T, Alloc>::insert_aux(iterator position, const T& x) 
  if (finish != end_of_storage) //如果还有备用空间
    construct(finish, *(finish - 1));//在备用空间开头构造一个对象,以最后一个元素为对象内容
    ++finish;
    T x_copy = x;
    copy_backward(position, finish - 2, finish - 1);
    *position = x_copy;
  
  else 
    const size_type old_size = size();
    const size_type len = old_size != 0 ? 2 * old_size : 1;
    iterator new_start = data_allocator::allocate(len);
    iterator new_finish = new_start;
    __STL_TRY 
      new_finish = uninitialized_copy(start, position, new_start);
      construct(new_finish, x);
      ++new_finish;
      new_finish = uninitialized_copy(position, finish, new_finish);
    

#       ifdef  __STL_USE_EXCEPTIONS 
    catch(...) 
      destroy(new_start, new_finish); 
      data_allocator::deallocate(new_start, len);
      throw;
    
#       endif /* __STL_USE_EXCEPTIONS */
    destroy(begin(), end());
    deallocate();
    start = new_start;
    finish = new_finish;
    end_of_storage = new_start + len;
  

备用内存够用时,执行流程如下图显示(结合源代码看此解释,版本为C++ 2.91版本)

 

 

备用内存不够用时,执行流程如下图显示

 

以上是关于stl_vector::insert_aux方法原理的主要内容,如果未能解决你的问题,请参考以下文章

哪些方法改变原数组,哪些方法不改变原数组

数组都有哪些方法? 哪些会改变原数组?

不改变原数组的方法

js中改变原数组的方法以及解决改变原数组的方法

js哪些方法改变原数组哪些不改变原数组

数组中的方法-- 会改变原数组的