zoukankan      html  css  js  c++  java
  • vector实现

    typedef int size_type;
    /*
    vector维护的是一个连续线性空间,提供的迭代器是Random Access Iterators即普通指针
    */
    template <class T,class Alloc=alloc>
    class vector
    {
    protected:
        iterator start;//目前使用空间的头
        iterator finish;//目前使用空间的尾
        iterator end_of_storage;//目前可用空间的尾
    public:
        void push_back(const T& x);
        void insert_aux(iterator position, const T& x);
        int size()const{ return int(end() - begin()); }
    };
    
    /*
    vector动态增加大小,并不是在原空间之后开辟新空间,因为无法保证原空间之后尚有可供配置的空间,而是以
    原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间
    */
    template<class T,class Alloc=alloc>
    void vector::push_back(const T& x)
    {
        if (finish != end_of_storage)
        {
            construct(finish, x);
            ++finish;
        }
        else//已无备用空间
            insert_aux(end(), x);
    }
    
    template<class T, class Alloc = alloc>
    void vector<T, Alloc>::insert_aux(iterator position, const T& x)
    {
        const size_type old_size = size();
        const size_type len = old_size != 0 ? 2 * old_size : 1;
        /*
        配置原则:若原空间大小为0,则配置一个元素大小,否则配置原大小的两倍
        前半段用来放置原数据,后半段用来放置新数据
        */
        //data_allocator为vector专有的空间配置器
        iterator new_start = data_allocator::allocate(len);
        iterator new_finish = new_start;
        //将原vector的内容拷贝到新vector
        new_finish = uninitialized_copy(start, position, new_start);
        //为新元素设定初值x
        construct(new_finish, x);
        ++new_finish;
    
        //析构并释放原vector
        destroy(begin(), end());
        deallocate();
    
        //调整迭代器
        start = new_start;
        finish = new_finish;
        end_of_storage = new_start + len;
    }
  • 相关阅读:
    十分钟了解HTTPS协议
    浅谈程序员的学历
    浅谈前后模板引擎的利与弊
    简单理解预加载技术
    简单理解懒加载技术
    C#.NET里面抽象类和接口有什么区别
    Select count(*)、Count(1)、Count(0)的区别和执行效率比较
    c#中decimal ,double,float的区别
    C#使用log4net记录日志
    SQLServer无法打开用户默认数据库 登录失败错误4064的解决方法
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/4221080.html
Copyright © 2011-2022 走看看