zoukankan      html  css  js  c++  java
  • vector源码

    成员变量

    //迭代器
    //对应begin()
    iterator start;
    //对应end(), 指向可用空间下一个位置
    iterator finish;
    //指向整个容量的一下个位置
    iterator end_of_storage;

    push_back,

    将新元素插入vector尾端时,先检查是有还有备用空间,如果有就直接在备用空间上构造元素,并调整迭代器finish。 

    如果没有备用空间,就要扩充空间(重新配置,移动数据,释放原空间)

    void push_back(const T& x)
    {
         if(finish != end_of_storage)
        {
            construct(finish, x);
            ++finish;
        }
        else
            insert_aux(end(), x);
    }

    insert_aux,单个元素插入指定位置

    template<typename T, typename Alloc>
    void MVector<T, Alloc>::insert_aux(iterator position, const T& x)
    {
            // 空间足够
        if (finish != end_of_storage)
        {
            construct(finish, *(finish - 1));
            ++finish;
    
            T x_copy = x;
    
            // 
            copy_backward(position, finish - 2, finish - 1);
            *position = x_copy;
        }
        else
        {
                    // 空间不足,重新分配空间
            const size_type old_size = size();
            const size_type len = old_size != 0 ? 2 * old_size : 1;
    
            iterator new_start = data_allocator::allocate(len);
            iterator new_finish = new_start;
    
            try {
                            // 前段拷贝
                new_finish = uninitialized_copy(start, position, new_start);
                            // 构造插入的元素
                construct(new_finish, x);
                ++new_finish;
                            // 后段拷贝
                uninitialized_copy(position, finish, new_finish);
            }
            catch (...)
            {
                            // 回滚
                destroy(new_start, new_finish);
                data_allocator::deallocate(new_start, len);
                throw;
            }
    
                    // 释放老内存
            destroy(begin(), end());
            deallocate();
    
            start = new_start;
            finish = new_finish;
            end_of_storage = new_start + len;
        }
    }
  • 相关阅读:
    SpringBoot(三)——使用Thymeleaf模板
    “Usage of API documented as @since 1.8+”报错的解决办法
    JAVA的多态性
    SQL的JOIN语句
    共享锁和排他锁
    软件工程团队作业---项目选题报告
    结对作业
    PMS---团队展示
    第二次作业——个人项目实战
    第一次作业---准备
  • 原文地址:https://www.cnblogs.com/jimobuwu/p/8692479.html
Copyright © 2011-2022 走看看