容器 - vector (1)

上一章:智能指针之使用 (3)

目录

C++里面的容器是怎么实现的呢?我们先不防自己写一个vector试一下。
要实现vector机制,主要要考虑下面几点

(1) 能够动态扩容。
(2) 能够通过下标取值。
(3) 能够通过迭代器进行循环。

首先考虑(1)和(2),其实现非常简单:

template<typename T>
class MyVector
{
    uint32_t capacity_;
    uint32_t length_;
    T* array_;
public:
    MyVector()
        :  capacity_(2), length_(0), array_(new T[capacity_])
    {}
    void push_back(const T& v)
    {
        if (length_ == capacity_)
        {
            extend();
        }
        array_[length_] = v;
        ++length_;
    }

    void remove(const T& v)
    {
        unsigned newIndex = 0;
        for (uint32_t i = 0; i < length_; ++i)
        {
            if (array_[i] == v)
            {
                continue;
            }

            if (newIndex != i)
            {
                array_[newIndex] = array_[i];
            }
            ++newIndex;
        }

        length_ = newIndex;
        if (length_ <= capacity_ / 3)
        {
            shrink();
        }
    }

    uint32_t size() const
    {
        return length_;
    }

    const T& operator[] (uint32_t index)
    {
        return array_[index];
    }

private:
    inline void extend()
    {
        capacity_ = 2 * capacity_;
        rellocate(capacity_);
    }

    inline void shrink()
    {
        if (capacity_ <= 2)
        {
            return ;
        }
        capacity_ = capacity_ / 2;
        rellocate(capacity_);
    }

    inline void rellocate(uint32_t size)
    {
        T* temp = new T[size];
        std::memcpy(temp, array_, sizeof(T) * length_);
        delete [] array_;
        array_ = temp;
    }
};

其中要注意的几个点是:

(1)扩容和缩容时的算法。
(2)扩缩容时内存的移动。
(3)删除元素时,数组的重排列。

此实现几乎没有什么难度。下一节中将讨论迭代器如何实现,这样就能利用STL的所有算法了。

后一章
目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 标签(空格分隔): STL 运用STL,可以充分利用该库的设计,让我为简单而直接的问题设计出简单而直接的解决方案,...
    认真学计算机阅读 1,511评论 0 10
  • 原文链接:http://net.pku.edu.cn/~yhf/UsingSTL.htm 三十分钟掌握STL这是本...
    Transnet2014阅读 1,101评论 0 10
  • STL部分 1.STL为什么广泛被使用 C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vec...
    杰伦哎呦哎呦阅读 4,347评论 0 9
  • 像梦一样。 因为那时还年少,所以有了放纵的理由。你想了想,抿唇笑了,这么多年过去,却仍旧有些不真实,仿佛时间流逝,...
    尽以阅读 348评论 0 1
  • 文/巷子 “看到我,别跟我打招呼。”-刘若英 的确是看到一篇推文的介绍才来到这里。没想到钟先生会把杂志馆开在这破旧...
    我是巷子阅读 1,133评论 0 1