• 线性表实现简单vector


    实现一个简单的vector

      Vector基于数组实现,可以复制并且其占用的内存可以自动回收(通过析构函数),可以调整Vector的大小,以及容量(容量的改变是通过为基本数组分配一个新的内存块,然后复制旧的内存块到新块中,再释放旧块的内存)。在进行插入和删除操作时,需要位置标记,这里使用通用的迭代器(其实就是指针)。

      代码如下:

    /*
    * 用数组的方式实现线性表
    */
    #include<iostream>
    using namespace std;
    
    template <typename Object>
    class Vector
    {
    private:
        int theSize;
        int theCapacity;
        Object * objects;
    
    public:
        //构造函数
        explicit Vector(int initSize = 0) : theSize(initSize), theCapacity(initSize + SPACE_CAPACITY) {
            objects = new Object[theCapacity];
        }
    
        //拷贝构造函数
        Vector(const Vector &rhs) :objects(NULL)
        {
            operator=(rhs);
        }
    
        //析构函数
        ~Vector()
        {
            delete[] objects;
        }
        
        //重载复制操作符
        const Vector &operator=(const Vector &rhs)
        {
            if (this != rhs)
            {
                delete[] objects;
                theSize = rhs.theSize;
                theCapacity = rhs.theCapacity;
                objects = new Object[capacity()];
                for (int i = 0; i < size();++i)
                {
                    objects[i] = rhs.objects[i];
                }
            }
            return *this;
        }
    
        //调整Vector的大小
        void resize(int newSize)
        {
            if (newSize > theCapacity)
            {
                reverse(newSize * 2 + 1);
            }
            theSize = newSize;
        }
    
        //调整容量
        void reverse(int newCapacity)
        {
            if (newCapacity < theSize)
                return;
            Object *oldArray = objects;
            objects = new Object[newCapacity];
            for (int i = 0; i < size(); ++i)
            {
                objects[i] = oldArray[i];
            }
            theCapacity = newCapacity;
            delete[] oldArray;
        }
    
        //重载取元素操作符[]
        Object & operator[](int index)
        {
            return objects[index];
        }
    
        //重载取元素操作符[] 返回值为左值不可修改
        Object & operator[](int index) const
        {
            return objects[index];
        }
    
        //判断是否为空
        bool empty()
        {
            return theSize == 0;
        }
    
        //获得Vector的大小
        int size() const
        {
            return theSize;
        }
    
        //获得theCapacity的大小
        int capacity() const
        {
            return theCapacity;
        }
    
        //在尾部插入元素
        void push_back(const Object &x)
        {
            if (theSize == theCapacity)
            {
                reverse(2 * theCapacity + 1);
            }
            objects[theSize++] = x;
        }
    
        //弹出尾部元素
        void pop_back()
        {
            theSize--;
        }
    
        //返回尾部元素
        const Object &back() const
        {
            return objects[theSize - 1];
        }
    
        //使用指针定义迭代器
        typedef Object * itreator;
        typedef const Object * const_itreator;
    
        //获取开始的迭代器
        itreator begin()
        {
            return &objects[0];
        }
    
        const_itreator begin() const
        {
            return &objects[0];
        }
    
        //获取结束的迭代器
        itreator end()
        {
            return &objects[size()];
        }
    
        const_itreator end() const
        {
            return &objects[size()];
        }
        enum { SPACE_CAPACITY = 16 };
    };
    
    
    int main()
    {
        Vector<int> vec;
        vec.push_back(2);
        vec.push_back(3);
        for (auto it = vec.begin(); it != vec.end();++it)
        {
            cout << *it << ' ';
        }
        return 0;
    }

    输出:

      

  • 相关阅读:
    .ssh/config 文件的解释算法及配置原则
    不fq安装 golang tools
    iOS 组件化的几篇文章
    第一把机械键盘 ikbc C-87
    我推荐的 Java Web 学习路线
    【吐槽向】iOS 中的仿射变换
    Spring 对缓存的抽象
    Spring 事务管理笔记
    Swift 笔记汇总
    Java 类加载器
  • 原文地址:https://www.cnblogs.com/zhangbaochong/p/5143237.html
Copyright © 2020-2023  润新知