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

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

【C++】vector容器的模拟实现--1 https://developer.aliyun.com/article/1424724

四,赋值运算符

       赋值运算符的实现跟拷贝构造函数实现机制相同。实现拷贝后要返回拷贝后的容器,以便实现连续赋值的情况。

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

五,容器接口的实现

1,迭代器实现

       这里实现begin()、end()、cbegin()、cend()四种常用的迭代器。


//begin()和end()的实现
iterator begin()
{
    return _start;
}
iterator end()
{
    return _finish;
}
//cbegin()和cend()常量迭代器的实现
const_iterator cbegin() const
{
    const_iterator p = (const_iterator)_start;
    return p;
}
const_iterator cend() const
{
    const_iterator p = (const_iterator)_finish;
    return p;
}

2,“ [] ”运算符的实现

       “ [] ” 运算符实现分为两种,一种是变量的实现,一种是常量const的实现。


//变量实现
T& operator[](size_t pos)
{
    assert(pos >= 0 && pos < size());
    return _start[pos];
}
//常量实现
const T& operator[](size_t pos)const
{
    assert(pos >= 0 && pos < size());
    const T tem = (const T)_start[pos];
    return tem;
}

3,swap交换和resize重设大小

       swap接口实现机制是容器的全部数据实现交换。resize实现时要考虑参数大于容器大小和小于容器大小时的不同情况。


//交换算法
void swap(vector<T>& v)
{
    std::swap(_start, v._start);
    std::swap(_finish, v._finish);
    std::swap(_endOfStorage, v._endOfStorage);
}
//设定大小算法
void resize(size_t n, const T& value = T())
{
    assert(n >= 0);  //防止错误操作
    if (n < size())  //小于容器大小时的情况
    {
        _finish = _start + n;
    }
    else     //大于等于容器大小时的情况
    {
        reserve(n);
        for (int i = 0; i < n - size(); i++)
        {
            push_back(value);
        }
    }
}


4,insert插入和erase删除

       这里实现insert插入要注意的是选择位置时,因为不确定数据类型,因此要在指定迭代器的位置进行插入,最后返回该位置的迭代器。


       erase删除位置与insert插入位置一样,删除迭代器所指向的位置,最后返回该位置的迭代器。


//插入算法,在pos位置下插入数据x
iterator insert(iterator pos, const T& x)
{
    //要考虑指定插入的位置在合理范围之内
    assert(pos >= _start && pos < _finish);
    if (size() == capacity())
    {
        reserve(size() + 1);
    }
    for (iterator it = _finish - 1; it >= pos; it--)
    {
        *(it + 1) = *(it);
    }
    *pos = x;
    return pos;
}
//删除算法,删除pos位置下的数据
iterator erase(iterator pos)
{
    //要考虑指定删除的位置在合理范围之内
    assert(size() > 0);
    assert(pos >= _start && pos < _finish);
    for (iterator i = pos; i < _finish - 1; i++)
    {
        *(i) = *(i + 1);
    }
    _finish--;
    return pos;
}


相关文章
|
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