• Vector 中迭代器的实现(代码)


    #pragma once
    //迭代器的实现
    class MyVector
    {
    public:
        /** 迭代器 **/
        class Iterator
        {
            friend class MyVector;
        public:
            Iterator(int* pos) :m_pos(pos)
            {
            }
            Iterator& operator++() //前++
            {
                ++m_pos;
                return *this;
            }
            Iterator operator++(int) //后++
            {
                int* posOld = m_pos;
                ++m_pos;
                return Iterator(posOld);
            }
            Iterator& operator--()//前--
            {
                --m_pos;
                return *this;
            }
            Iterator operator--(int)
            {
                int* posOld = m_pos;
                --m_pos;
                return Iterator(posOld);
            }
            bool operator==(Iterator& itr)
            {
                return (m_pos == itr.m_pos);
            }
            bool operator!=(Iterator& itr)
            {
                return !(*this == itr);
            }
            int& operator*()
            {
                return *m_pos;
            }
            int* operator->()
            {
                return m_pos;
            }
        private:
            int* m_pos = nullptr; //元素位置
        };
    
    public:
        Iterator begin(); //返回指向第一个元素的迭代器
        Iterator end();//返回指向最后一个元素后面位置的迭代器
    
    public:
        MyVector();
        ~MyVector();
        MyVector(const MyVector& obj);
    
    public:
        MyVector& operator=(const MyVector& obj);
    
    public:
        /**增加**/
        void push_back(const int& nVal);
    
        /*
        * 其他:会抛出异常exception
        */
        Iterator intsert(Iterator itr, const int& nVal);
    
        /* 修改 */
        int& operator[](int nIdx);
        int& at(int nIdx);
    
        /* 删除 */
        bool erase(Iterator itr);
        void pop_back();
    
    
        /* 查询 */
        Iterator find(const int& nVal);
    
    
        /* 其它 */
        int size();
    
    private:
        void CheckCapacity(); //检查内存是否足够放入新的数据
    
    private:
        int* m_pData = nullptr; //保存数组元素的缓冲区
        int  m_nCapacity = 0;   //整块内存的大小
        int  m_nSize = 0;       //当前内存中有多少数据
    
    private:
        const int m_nInitialCapacityLen = 8; //初始化内存的大小
    };
    #include "stdafx.h"
    #include "MyVector.h"
    #include <exception>
    #include <string>
    using namespace std;
    
    MyVector::MyVector()
    {
        m_pData = new int[m_nInitialCapacityLen];
        m_nCapacity = m_nInitialCapacityLen;
        m_nSize = 0;
    }
    
    
    MyVector::~MyVector()
    {
        /*
        * 释放资源
        */
        if (m_pData != nullptr)
        {
            delete[] m_pData;
            m_pData = nullptr;
        }
    
        m_nSize = 0;
        m_nCapacity = 0;
    }
    
    //返回指向第一个元素的迭代器
    MyVector::Iterator MyVector::begin()
    {
        return Iterator(m_pData);
    }
    
    //返回指向最后一个元素后面位置的迭代器
    MyVector::Iterator MyVector::end()
    {
        return Iterator(m_pData + m_nSize);
    }
    
    MyVector::MyVector(const MyVector& obj)
    {
        *this = obj;
    }
    
    MyVector& MyVector::operator=(const MyVector& obj)
    {
        //释放自己
        if (m_pData != nullptr)
        {
            delete[] m_pData;
        }
    
        //申请新内存
        m_pData = new int[obj.m_nCapacity]; 
        for (int i = 0; i < obj.m_nSize; i++)
        {
            m_pData[i] = obj.m_pData[i];
        }
        m_nSize = obj.m_nSize;
        m_nCapacity = obj.m_nCapacity;
    
        return *this;
    }
    
    /*
    增加
    */
    void MyVector::push_back(const int& nVal)
    {
        //检查内存大小
        CheckCapacity();
    
        //存入新的数值
        m_pData[m_nSize] = nVal;
        m_nSize++;
    }
    
    MyVector::Iterator MyVector::intsert(Iterator itr, const int& nVal)
    {
        /*
        *  获取索引值
        */
        int* pos = itr.m_pos;
        int nIdx = pos - m_pData;
    
    
        /*
        * 检查索引是否越界
        */
        if (nIdx < 0 || nIdx > m_nSize)
        {
            throw exception("索引越界");
        }
    
        /*
        * 检查内存大小
        */
        CheckCapacity();
    
        /*
        * 拷贝数据
        */
        int nSizeOfCopyData = (m_nSize - nIdx)*sizeof(int);   //拷贝的数据的大小
        int* pBeginPos = m_pData + nIdx;        //拷贝数据的起始位置
        int* pEndPos = m_pData + nIdx + 1;   //拷贝数据的目的位置
        memcpy(pEndPos, pBeginPos, nSizeOfCopyData);
    
        /*
        *  保存新的数据
        */
        m_pData[nIdx] = nVal;
        m_nSize++;
    
        return Iterator(&m_pData[nIdx]);
    }
    
    /*
    修改
    */
    int& MyVector::operator[](int nIdx)
    {    
        /*
         * 检查索引是否越界
         */
        if (nIdx < 0 || nIdx >= m_nSize)
        {
            throw exception("索引越界");
        }
    
        return m_pData[nIdx];
    }
    int& MyVector::at(int nIdx)
    {   
        /*
         * 检查索引是否越界
         */
        if (nIdx < 0 || nIdx >= m_nSize)
        {
            throw exception("索引越界");
        }
    
    
        return m_pData[nIdx];
    }
    
    /*
    删除
    */
    bool MyVector::erase(Iterator itr)
    {
        /*
        *  获取索引值
        */
        int* pos = itr.m_pos;
        int nIdx = pos - m_pData;
    
        /*
        * 检查索引是否越界
        */
        if (nIdx < 0 || nIdx >= m_nSize)
        {
            throw exception("索引越界");
        }
    
        /*
        * 拷贝数据,覆盖被删除的数据
        */
        int* pBeginPos = m_pData + nIdx + 1; //获取拷贝数据的起始位置
        int* pEndPos = m_pData + nIdx;       //获取拷贝数据的目标位置
        int  nSizeOfCopyData = (m_nSize - nIdx - 1)*sizeof(int); //拷贝的数据大小
        memcpy(pEndPos, pBeginPos, nSizeOfCopyData);
    
        m_nSize--;
        return true;
    }
    void MyVector::pop_back()
    {
        /*
        * 检查索引是否越界
        */
        if (m_nSize <= 0)
        {
            throw exception("索引越界");
        }
    
        //删除数据
        m_nSize--;
    }
    
    /*
    查询
    */
    MyVector::Iterator MyVector::find(const int& nVal)
    {
        for (int i = 0; i < m_nSize; i++)
        {
            if (nVal == m_pData[i])
            {
                return Iterator(&m_pData[i]);
            }
        }
    
        return Iterator(nullptr);
    }
    
    /*
    其它
    */
    int MyVector::size()
    {
        return m_nSize;
    }
    
    //检查内存是否足够放入新的数据
    void MyVector::CheckCapacity()
    {
        //内存不够,申请新内存
        if (m_nSize >= m_nCapacity)
        {
            int* pData = new int[m_nCapacity * 2];              //申请新内存
            memcpy(pData, m_pData, m_nCapacity * sizeof(int));  //拷贝原来的数据
            delete[] m_pData;   //释放原来的额内存
            m_pData = pData;
            m_nCapacity = m_nCapacity * 2;
        }
    }
    学如逆水行舟,不进则退。 博客园技术交流群 群 号:1073255314 (本群没人,刚刚建立 -_-!!! )
  • 相关阅读:
    解决硬盘分区无法挂载的问题
    Java EE学习记录(一)
    Netbeans 8.2启动参数含义及配置
    汉化CodeBlock
    linux解决无法打开资源管理器
    netbean下搭建mariadb数据库
    mariadb中执行数据库脚本的方法
    修复受损的linux引导
    修复无法启动的mariadb
    no update
  • 原文地址:https://www.cnblogs.com/Mj-NaijAm/p/13611598.html
Copyright © 2020-2023  润新知