Vector C++实现(在校旧文)

大二的时候在听邓公的课上手抄的(手打算不算原创啊)
ლ(ó﹏òლ)对不起

Vector 实现如下,包括了几种排序算法:


typedef int rank; //秩 
#define DEFAULT_CAPACITY 3 //默认初始容量 
template <tempname T> class Vector{ //向量模板类 
private:
protected:
    Rank _size;int _capacity;T* _elem; //规模、容量、数据区
    void copyFrom (T const*A,Rank lo,Rank hi);//复制数组区间A[lo,hi)
    void expand();//空间不足时扩容
    void shrink();//填装因子过小时压缩
    bool bubble(Rank lo,Rank hi);//扫描交换
    void bubbleSort(Rank lo,Rank hi);//气泡排序算法
    Rank max(Rank lo,Rank hi);//选取最大元素
    void selectionSort(Rank lo,Rank hi);//选择排序算法
    void mergr(Rank lo,Rank mi,Rank hi);//归并算法
    void mergeSort(Rank lo,Rank hi);//归并排序算法
    Rank partition(Rank lo,Rank hi);//轴点构造算法
    void quickSort(Rank lo,Rank hi);//快速排序算法
    void heapSort(Rank lo,Rank hi);//堆排序 
/*...内部函数*/
public: 
//构造函数
    Vector( int c = DEFAULT_CAPACITY, int s = 0, T v = 0) {//容量为c 规模为s 所有元素初始为v 
        _elem = new T[_capacity = c] ;
        for( _size = 0; _size < s; _elem[_size++] = v);
    }
    Vector(T const* A, Rank n){//数组整体复制 
        copyFrom(A, 0, n);
    }
    Vector(T const*A, Rank lo, Rank hi){//数组区间复制 
        copyFrom(A, lo, hi);
    }
    Vector(Vector<T> const& V){//向量整体复制 
        copyFrom(V._elem, 0, V._size);
    }
    Vector(Vector<T> const& V, Rank lo, Rank hi) { //向量区间复制 
        copyFrom(V._elem, lo, hi);
    }
//析构函数
    ~Vector(){//释放内存空间 
        delete [] _elem;
    } 
// 只读访问接口
    Rank size() const {//规模 
        return _size;
    }
    bool empty() const {//判空 
        return !_size;
    } 
    int disordered() const;//判断向量是否已排序
    Rank find(T const& e) const{
        return find(e, 0, _size);//无序向量整体查找 
    } 
    Rank find(T const& e, Rank lo, Rank hi) const;//无序向量区间查找
    Rank search(T const& e) const {//有序向量整体查找 
        return (0 >= _size) ? -1 : search(e, 0, _size);
    } 
    Rank search(T const& e, Rank lo, Rank hi) const;//有序向量区间查找
    //可写访问接口
    T& operator[](Rank r) const;//重写下标操作符,可以类似数组形式引用各个元素
    Vector<T> & operator = (Vector<T> const&);//重写赋值操作符,可以直接克隆向量
    T remove(Rank r); //删除秩为r的元素
    int remove(Rank lo, Rank hi); //删除秩在区间[lo,hi]之内的元素
    Rank insert(Rank r, T const& e); //插入元素
    Rank insert(T const& e){//默认作为末元素插入 
        return insert (_size, e);
    } 
    void sort (Rank lo, Rank hi);//对[lo,hi)排序
    void sort (){//整体排序 
        sort(0, _size);
    } 
    void unsort(Rank lo, Rank hi); //对[lo,hi)置乱
    void unsort(){//整体置乱 
        unsort(0, _size);
    } 
    int deduplicate();//无序去重
    int uniquify();//有序去重
    //遍历
    void traverse(void (* ) (T& ));//遍历(使用函数指针,只读或局部性修改)
    template <tempname VST> void traverse (VST& );//遍历(使用函数对象,可全局性修改) 
};
// copyFrom 的实现 
template <tempname T>//元素类型 
void Vector<T>::copyFrom(T const& A, Rank lo, Rank hi){ //以数组区间A[lo,hi)为蓝本复制向量 
    _elem = new T[_capacity = 2 * (hi - lo)];
    _size = 0; //分配空间,规模清零 
    while(lo<hi){//逐一复制 
        _elem[_size++] = A[lo++];
    }
}
 // 赋值运算符的重载 
template <tempname T>
Vector<T>& Vector<T>::operator = (Vector<T> const& V){//重载赋值运算符 
    if(_elem){//释放原有空间 
        delete [] _elem;
        copyFrom(V._elem, 0, V._size);//整体复制
        return *this;//返回当前对象的引用,以便链式赋值 
    } 
} 
//扩容 
template <tempname 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];//复制原向量内容 
    }  
    delete [] oldElem;//释放原空间 
} 
//缩容 
template <tempname T> void Vector<T>::shrink(){//装填因子过小时压缩向量所占的容量 小于1/4时减半 
    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;//释放原空间 
}
//直接引用元素 重载向量操作符[]
template <tempname T> T& Vector::operator[](Rank r) const{
    return _elem[r];//assert 0 <= r < _size
} 
//置乱器
template <tempname T> void Vector<T>::permute(Vector<T>& V){
    for(int i = V.size(); i > 0; i--){//自后向前 
        swap(V[i-1], V[rand() % i]);//V[i-1] 与 V[0,i)中某一个随机元素交换 
    }
}
//向量区间置乱器
template <tempname T> Vector<T>::unsort(Rank lo, Rank hi){
    T* V = _elem + lo;
    for(Rank i = hi - lo; i > 0; i--){
        swap(V[i - 1],rand() % i);
    }
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该复习文档是本人根据和 CSDN 博客上的众多文章总结而成。感谢各位大佬 博客上的众多文章总结而成。感谢各位大佬 的总结,使我在复习课本同时补充了很多其他方面关键知识如 的总结,使我在复习课本同时补充了很多其他方面关键知识如 的总结,使我在复习课本同时补充了很多其他方面关键知识如 C++ 内存管理, 内存管理, STL 库 等内容。本文章适合 等内容。本文章适合 等内容。本文章适合 等内容。本文章适合 C++ C++初学者的快速复习和应届生笔试面准备,书中 给出了初学者的快速复习和应届生笔试面准备,书中 给出了初学者的快速复习和应届生笔试面准备,书中 给出了初学者的快速复习和应届生笔试面准备,书中 给出了初学者的快速复习和应届生笔试面准备,书中 给出了初学者的快速复习和应届生笔试面准备,书中 给出了初学者的快速复习和应届生笔试面准备,书中 给出了初学者的快速复习和应届生笔试面准备,书中 给出了初学者的快速复习和应届生笔试面准备,书中 给出了初学者的快速复习和应届生笔试面准备,书中 给出了初学者的快速复习和应届生笔试面准备,书中 给出了初学者的快速复习和应届生笔试面准备,书中 给出了初学者的快速复习和应届生笔试面准备,书中 给出了常见的 C++ 拔高的部分知识。对 于初学者来说,也可以加强C++ 的认识。 的认识。 文档主要分为 C++ 数据结构具体 数据结构具体 实现代码, C++ 的 STL 库, C++ 与数据库, 与数据库, C++ 内存管 理, C++ 智能指针和基于 智能指针和基于 C++ 的网络爬虫 的网络爬虫 (暂定) 。这一些知识般在课上被老师直接跳过, 。这一些知识般在课上被老师直接跳过, 笔者在看了众多大佬的面经中,感觉这几个部 分是被问最因此挑出笔者在看了众多大佬的面经中,感觉这几个部 分是被问最因此挑出笔者在看了众多大佬的面经中,感觉这几个部 分是被问最因此挑出分进行总结。 最后部分对谢希仁的《计算机网络》进行了回顾,重点是链路层运输和 应用层部分的 DNS 。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值