【C++】vector容器的模拟实现--1

简介: 【C++】vector容器的模拟实现--1

介绍:


       本文,我们重点实现vector容器的用法,这里要注意的是vector容器可以接纳任意类型,所以,在实现的时候需使用模板来控制。模拟实现vector重点还要放在构造、析构和赋值运算符重载。


一,框架设计

       vector容器设置中,由于需要接纳各种类型,因此,在框架设计中需要使用模板。除此之外,要想访问未知类型数据,需要使用迭代器来访问。这里,我们设置三个迭代器,分别指向数据块开始位置、有效数据的末尾、存储容量的末尾。


template<class T>
class vector
{
public:
    typedef T* iterator;           //数据迭代器
    typedef const T* const_iterator;   //常量迭代器
private:
    iterator _start;                  // 指向数据块的开始
    iterator _finish;                // 指向有效数据的尾
    iterator _endOfStorage;  // 指向存储容量的尾
};


二,构造函数

       在使用构造函数之前,我们首先要考虑基础的算法设置以方便使用:reverse扩容、capacity容器容量、size容器大小、push_back增添元素、pop_back删除元素。

//获取容器大小
size_t size() const
{
    return _finish - _start;
}
//获取容器容量
size_t capacity() const
{
    return _endOfStorage - _start;
}
//容器扩容
void reserve(size_t n)
{
    if (n > capacity())    //只能增容不能缩小
    {
        int newsize = size();
        T* tem = new T[n];
        memcpy(tem, _start, sizeof(T) * newsize);
        if (_start)
        {
            delete[] _start;
        }
        _start = tem;
        _finish = _start + newsize;
        _endOfStorage = _start + n;
    }
}
//增添数据
void push_back(const T& x)
{
    if (capacity() == size())   //这里要注意容量是否够用
    {
        int newcapacity = capacity() == 0 ? 4 : 2 * capacity();
        reserve(newcapacity);
    }
    int newsize = size();
    _start[newsize] = x;
    _finish++;
}
//删除数据
void pop_back()
{
    assert(size() > 0);   //这里要注意容器是否为空
    _finish--;
}

普通构造函数      


       首先,我们先实现无任何传入值的构造函数。这种情况只需初始化容器的各种数据即可,不需要做任何增添。


vector()
{
    _start = _finish = _endOfStorage = nullptr;   //直接将数据设为空
}


       第二种构造方式这里模拟实现构造n个数据,如:vectorv(5,8)初始化为5个8。


//T()表示T类型的构造函数,即上面第一种的构造函数实现 
vector(int n, const T& value = T())  
{
    reserve(n);      //这里要先进行扩容
    for (int i = 0; i < n; i++)
    {
        push_back(value);  
    }
}


       第三种构造方式模拟实现迭代器的方式进行构造。因为数据类型未知,所以这里还需要使用模板。


//这里迭代器要使用模板


template<class InputIterator>   
//first指向开始位置,last指向终点的下一位
vector(InputIterator first, InputIterator last)  
{
    int newsize = last - first;  
    reserve(newsize);
    for (int i = 0; i < newsize; i++)
    {
        push_back(*(first + i));
    }
}


拷贝构造函数


       原理跟普通构造函数实现的机制一样,这里就不做过多说明,直接实现代码,如下:


vector(const vector<T>& v)
{
    int newsize = v.capacity();
    reserve(newsize);
    for (int i = 0; i < newsize; i++)
    {
        push_back(v._start[i]);
    }
}

三,析构函数

       析构函数在释放空间之后要记得将数据初始化,以保证安全性。


~vector()
{
    delete[] _start;
    _start = _finish = _endOfStorage = nullptr;
}

【C++】vector容器的模拟实现--2 https://developer.aliyun.com/article/1424725?spm=a2c6h.13148508.setting.21.214f4f0eXZtIwY

相关文章
|
19天前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
34 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
5天前
|
存储 C++ 索引
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
13 1
|
19天前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
51 6
|
15天前
|
编译器 C++
【C++】—— vector模拟实现
【C++】—— vector模拟实现
|
19天前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
41 5
|
19天前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
41 2
|
10天前
|
算法 C++ 容器
C++之打造my vector篇(下)
C++之打造my vector篇(下)
19 0
|
10天前
|
存储 编译器 C++
C++之打造my vector篇(上)
C++之打造my vector篇(上)
20 0
|
15天前
|
算法 C++ 容器
【C++】—— vector使用
【C++】—— vector使用
|
17天前
|
存储 缓存 C++
C++番外篇——list与vector的比较
C++番外篇——list与vector的比较
18 0