【问题标题】:Increase capacity for vector增加向量容量
【发布时间】:2015-04-25 06:54:56
【问题描述】:

免责声明 1 - 我是编程新手 免责声明 2 - 我已经搜索和搜索,但找不到我正在寻找的帮助。

对于一个项目,我或多或少地以更精简的形式重写了矢量类。我挂断的部分是编写 push_back 方法。一切都很好,直到我不得不增加阵列的容量。

我假设应该做的是创建一个增加大小的新向量,然后将元素从旧向量复制到新向量,然后使用赋值运算符将 oldVector 分配给 newVector。

我要么错误地编写了我的 push_back 方法,不正确地重载了​​ = 运算符,要么我只是对应该发生的事情缺乏了解。任何帮助将不胜感激。

编译时,我在分配 this = tempV 的行上收到错误“需要左值作为赋值的左操作数”

template <class T>
Vector<T>& Vector<T>::operator = (const Vector<T> & v)
{
    int newSize = v.size();
    int newCapacity = v.getCapacity();
    data = new T[newCapacity];
    for(int i = 0; i < newSize; i++)
        data[i] = v.data[i];
    return *this;
}

template <class T>
void Vector <T> :: push_back(const T & number)
{
    if(numItems == capacity)
    {
        Vector <T> tempV(this->capacity * 2);
        for(int i = 0; i < numItems; i++)
            tempV.data[i] = data[i];
        *this = tempV;
    }
    if(numItems < capacity)
        data[numItems++] = number;
}

更新 所以我明白为什么我的代码在使用时无法编译

*this = tempV;

在我的复制方法中,我使用的是 v.size 而不是 v.size() 作为方法。修复后,代码编译并运行,但是我的向量的容量是相同的,并没有像我预期的那样增加。我仍然缺少一些东西。上面的代码已经更新。

再次感谢您的任何/所有帮助!

【问题讨论】:

    标签: c++ vector push-back capacity


    【解决方案1】:

    为什么要创建一个新的Vector&lt;T&gt;?只需创建一个新数组:

    template <class T>
    void Vector <T> :: push_back(const T & number)
    {
        if(numItems == capacity)
        {
            capacity *= 2;
            T* newData = new T[capacity];
            std::copy(data, data + numItems, newData);
            delete[] data;
            data = newData;
        }
    
        data[numItems++] = number;
    }
    

    【讨论】:

    • 感谢 Databyte,这就是解决方案。但是,我不完全了解实际容量是如何被复制的。据我了解,当您复制这样的数组时,不会复制任何未填充的内存。如果您有一些额外的时间并且不喜欢我,我想了解它是如何工作的(我还是编程新手)
    • 我不完全理解你的问题...向量是一个容器,将其项目存储在连续的内存块中(以允许快速索引访问)。为此,向量使用内部数组。为了提高性能,分配了一个更大的阵列(根据需要)(这就是容量)。 push_back new 有一个工作:在向量的末尾添加一个新元素(参见 push_back 的最后一行)。但有时内部数组已经满了。在这种情况下,我们必须分配新的更大的连续内存,将数据复制到新数组中,然后删除旧数组(第 4-11 行)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    相关资源
    最近更新 更多