【C++】数据结构——向量

本文档详细介绍了如何实现一个基于向量的抽象数据类型(ADT),包括其构造函数、只读和可写接口、运算符重载、动态空间管理、排序、查找、删除和去重等操作。向量类使用模板实现,支持不同类型的元素,并通过数组进行存储。此外,还讨论了冒泡排序、二分查找等算法在向量操作中的应用。

参考书籍:《数据结构(C++语言版)》邓俊辉著

向量(vector)是最基本的线性数据结构——序列(sequence)中的一种。向量中。所有数据项的物理存放位置与其逻辑次序一致,其逻辑次序被称作秩(rank)。

C++中已经有实现向量的库<vector>,我们不使用该库,而是仿照它实现一种基于向量的抽象数据类型(Abstract Data Type,ADT)。

ADT接口

下面列出需要实现的接口:

操作接口 功能 适用对象
size ( ) 返回向量规模 向量
get ( r ) 获取秩为r的元素 向量
put ( r, e ) 用e替换秩为r的元素 向量
insert ( r, e ) 在秩为r的位置插入元素e 向量
remove ( r ) 删除秩为r的对象并返回 向量
disordered ( ) 判断是否逆序,返回逆序数 向量
sort ( ) 非降序重新排列 向量
find ( e ) 查找目标元素,返回最大的秩 向量
search ( e ) 查找目标元素,返回最大的秩 有序向量
deduplicate ( ) 删除重复元素 向量
uniquify ( ) 删除重复元素 有序向量
traverse ( ) 遍历向量并统一处理 向量

Vector模板类

下面定义Vector模板类:

typedef int Rank;
#define DEFAULT_CAPACITY 3

template <typename T>
class Vector
{
   
   
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);				 //冒泡排序的基本操作,扫描交换
public:
    //构造函数
    Vector(int c = DEFAULT_CAPACITY, int s = 0, T v = 0)
    {
   
   
        _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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值