zoukankan      html  css  js  c++  java
  • 数据结构-向量

    向量(vector容器)
        vector大家都经常使用,其实向量是一个动态数组,所谓动态就是数组在声明后还可以增长,也可以插入元素,动态数组在增长的时候,其实也就是先分配好内存,然后new 一个数组,一个个将原数组再拷贝进去。向量使用完后再delete分配的内存。

        向量的优点和数组一样,缺点就是增长过快的时候比较耗资源。

    例子:

    数据结构one_vector的简单实现

    #include <iostream>
    using namespace std;
    
    template<typename Object>
    class  Vector
    {
    private:
        int theSize;                         //实际数据大小
        int theCapacity;                     //实际容器容量大小
        Object *objects;                     //基本数组
    public:
        enum { SPACE_CAPACITY = 16 };        //默认容量大小
        
        explicit Vector(int initSize = 0)    //单参数构造函数要用explicit()避免类型在后台转换
            : theSize(initSize), theCapacity(initSize + SPACE_CAPACITY) {
            objects = new Object[theCapacity];
        }
        Vector(const Vector& rhs) : objects(NULL) {    //复制构造函数--调用operator=对已有的Vector进行复制
            operator = (rhs);
        }
        ~Vector() {
            delete[] objects;
        }
    
        const Vector& operator = (const Vector& rhs) //重载赋值运算符
        {
            if (this != &rhs)                        //避免复制自身--混淆检验
            {
                delete []objects;                    //删除旧的内存空间
                theSize = rhs.size();                //生成同样的样本大小
                theCapacity = rhs.theCapacity;       //生成同样的容量大小
    
                objects = new Object[capacity()];    //生成与所复制的Vector同样容量的新数组
                for (int k = 0; k < size(); k++)
                    objects[k] = rhs.objects[k]; 
            }
            return *this;
        }
        
        void resize(int newSize)
        {
            if (newSize > theCapacity)        //重置大小
                reserve(newSize * 2 + 1);     //新大小
            theSize = newSize;
        }
    
        void reserve(int newCapacity)
        {
            if (newCapacity < theSize)        //至少和(样本大小)一样大
                return;
    
            Object *oldArray = objects;       //oldArray--用于复制旧数组内容
            objects = new Object[newCapacity];
            for (int k = 0; k < theSize; k++)
                objects[k] = oldArray[k];
    
            theCapacity = newCapacity;
            delete []oldArray;
        }
    
        Object& operator[] (int index)
        {
            return objects[index];
        }
        const Object& operator[] (int index) const
        {
            return objects[index];
        }
    
        bool empty() const {
            return size() == 0;
        }
        
        int size() const {
            return theSize;
        }
        int capacity() const {
            return theCapacity;
        }
        void push_back(const Object& x) {
            if (theSize == theCapacity)
                reserve(2 * theCapacity + 1);
            objects[theSize++] = x;
        }
        
        void pop_back() {
            theSize--;
        }
        const Object& back() const {
            return objects[theSize - 1];
        }
        
        typedef Object *iterator;
        typedef const Object *const_iterator;
    
        iterator begin() {
            return &objects[0];
        }
        const_iterator begin() const {
            return &objects[0];
        }
        iterator end() {               //尾后的不存在的指针
            return &objects[size()];     
        }
        const_iterator end() const {
            return &objects[size()];
        }
    };
    
    int main()
    {
        Vector<int> test;
        int data;
        while (cin >> data)
        {
            test.push_back(data);
        }
        Vector<int>::iterator it;
        for (it = test.begin(); it != test.end(); ++it)
            cout << *it << " ";
        cout << endl;
        cout << "pop_one.....
    ";
        test.pop_back();
        cout << test.back() << endl;
        return 0;
    }

    --------

  • 相关阅读:
    haproxy+keepalived配置haproxy反向代理的高可用
    正则表达式
    logstash 中multiline插件的用法
    logtash 接收多配置文件
    Debian 8 升级到 9 Debian 9 How to upgrade Debian 8 Jessie to Debian 9 Stretch
    YOLO object detection with OpenCV
    快速 图片颜色转换迁移 Color Transfer Opencv + Python
    对抗网络GAN的应用实例
    nvflash 报错解决
    卷积神经网络(CNN)在语音识别中的应用
  • 原文地址:https://www.cnblogs.com/Ph-one/p/7088702.html
Copyright © 2011-2022 走看看