Vector::insert remove

首先看看vector不同于数组的一个地方:可以根据数据的多少扩容:
至于这里为什么要是扩充一倍,因为扩容函数执行也需要时间开销,当以增加一倍扩容时调用扩容的概率和容量的匹配要更好:

template <typename T> void Vector<T>::expand() { //向量空间不足时扩容
   if (_size < _capacity) return; //尚未满员时,不必扩容
   if (_capacity < DEFAULT_CAPACITY) _capacity = DEFAULT_CAPACITY; //不低于最小容量
   T* oldElem = _elem;  _elem = new T[_capacity <<= 1]; //容量加倍
   for (int i = 0; i < _size; i++)
      _elem[i] = oldElem[i]; //复制原向量内容(T为基本类型,或已重载赋值操作符'=')
   /*DSA*/ //printf("\n_ELEM [%x]*%d/%d expanded and shift to [%x]*%d/%d\n", oldElem, _size, _capacity/2, _elem, _size, _capacity);
   delete [] oldElem; //释放原空间
}

在秩为r处插入元素:

template <typename T> //将e作为秩为r元素插入
Rank Vector<T>::insert(Rank r, T const& e) { //assert: 0 <= r <= size
   expand(); //若有必要,扩容
   for (int i = _size; i > r; i--) _elem[i] = _elem[i-1]; //自后向前,后继元素顺次后移一个单元
   _elem[r] = e; _size++; //置入新元素并更新容量
   return r; //返回秩
}

默认的是在末尾插入元素:

   Rank insert(T const & e) { return insert(_size, e); } //默认作为末元素插入

当删除元素时可能会缩容:

template <typename T> void Vector<T>::shrink() { //装填因子过小时压缩向量所占空间
   if (_capacity < DEFAULT_CAPACITY<<1) return; //不致收缩到DEFAULT_CAPACITY以下
   if (_size<<2 > _capacity) return; //以25%为界
   T* oldElem = _elem;  _elem = new T[_capacity >>= 1]; //容量减半
   for (int i = 0; i < _size; i++) _elem[i] = oldElem[i]; //复制原向量内容
   delete [] oldElem; //释放原空间
}

remove某块区域:

template <typename T> int Vector<T>::remove(Rank lo, Rank hi) { //删除区间[lo, hi)
   if (lo == hi) return 0; //出于效率考虑,单独处理退化情况,比如remove(0, 0)
   while (hi < _size) _elem[lo++] = _elem[hi++]; //[hi, _size)顺次前移hi - lo个单元
   _size = lo; //更新规模,直接丢弃尾部[lo, _size = hi)区间
   shrink(); //若有必要,则缩容
   return hi - lo; //返回被删除元素的数目
}

删除某一个秩为r的元素:

template <typename T> T Vector<T>::remove(Rank r) { //删除向量中秩为r的元素,0 <= r < size
   T e = _elem[r]; //备份被删除元素
   remove(r, r + 1); //调用区间删除算法,等效于对区间[r, r + 1)的删除
   return e; //返回被删除元素
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值