Skip to the content.
//动态空间管理

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 = oldElem[i]
    }
    delete [] oldElem;
}



//容量递增策略
T* oldElem = _elem;
_elem = new T[_capacity += INCREMENT]

//加倍式扩容
T* oldElem = _elem;
_elem = new T[_capacity <<= 1]

 //分摊分析 amortized complexity

  //深复制和浅复制?



//无序向量

Template <typename T> Vector{};
Vector < int > myVector;
Vector < float > myVector;
Vector < char > myVector;
Vector < BinTree > forest;

//循秩访问
V.get(r);
V.put(r,e);

T & Vector<T>::operator[](Rank r) const {return _elem[r];}

//右值
T x = ...
//左值
V[r] = (T)...

//插入
template <typename T>
Rank Vector<T>::insert(Rank r, T const & e){
    expand();
    for (int i = _size; i > r; i--){
        _elem[i] = _elem[i-1];   
    }
    _elem[r]=e; _size++;
    return r;
}

//区间删除
template <typename T>
int Vector<T>::remove(Rank lo, Rank hi){
    if ( lo == hi) return 0;
    while(hi < _size) _elem[lo++] ==  _elem[hi++];
    _size = lo; shrink();
    return hi - lo;
}

//单元素删除
template < typename T>
T Vector<T>::remove(Rank r){
    T e = _elem[r];
    remove(r,r+1);
    return e;
}

//查找
template <typename T>
Rank Vector<T>::find(T const & e, Rank lo, Rank hi) const{
    while ((lo<hi--) && (e!=_elem[hi]));
    return hi;
}

//相邻逆序对
template <typename T>
int Vector<T>::disorder() const{
    int n = 0;
    for (int i = 1; i<_ size; i++)
        n += (_elem[i-1] > _elem[i]);
    return n;
}

//唯一化-低效版
template <typename T> int Vector<T>::uniquify(){
    int oldSize = _size; int i=0;
    while(i < _size-1)
        (_elem[i] == _elem[i+1])? remove(i+1) : i++;
    return oldSize - _size;
}

//唯一化-高效版

template <typename T> int Vector<T>::uniquify(){
    Rank i = 0, j = 0;
    while (++j <_size)
        if(_elem[i] != _elem[j])
            _elem[++i] = _elem[j];
    _size = ++i; shrink();
    return j-i;
}

//二分查找

template <typename T> //查找算法统一接口
Rank Vector<T>::search(T const & e, Rank lo, Rank hi) const {
    return (rand() % 2 )?
        binSearch(_elem, e, lo, hi)
    :   fibSearch(_elem, e, lo, hi)
}

//二分查找实现
template <typename T>
static Rank binSearch(T* A, T const& e, Rank lo, Rank hi)
{
    while (lo < hi){
        Rank mi = (lo+hi) >> 1;
        if (e<A[mi]) hi = mi;
        else if (A[mi]<e) lo=mi+1;
        else return mi;
    }
    return -1;
}

//Fibonacci Search

template <typename T>
static Rank