在if语句

时间:2017-11-25 23:02:31

标签: c++ arrays

我正在编写管理动态对象数组的类。现在我遇到了应该在给定索引处插入元素的方法,但在检查该索引是否不比数组容量大之前。然后它应该首先调整数组大小。

template <class T>
void MyVector<T>::insertAt(int index, const T &m_element) {
    if(p_size == p_capacity) extendArray();
    if(index >= p_capacity) extendArray(index);
    p_size++;
    p_array[index] = m_element; 
}

    template <class T>
void MyVector<T>::extendArray(int new_capacity) {    
    std::unique_ptr<T[]> temp_array = std::make_unique<T[]>(new_capacity);
    for (int i = 0; i <= p_size; i++) {
        temp_array[i] = p_array[i];
    }

    p_array.reset();

    p_array = std::make_unique<T[]>(new_capacity);
    for (int i = 0; i <= p_size; i++) {
        p_array[i] = temp_array[i];
    }  
}

extendArray()只扩展数组容量2次,extendArray(int)将数组容量扩展为索引给定的数字。第一种方法工作正常,第二种方法并非如此。

int main(){
    MyVector<int> test;
    test.insertAt(0, 5);
    test.insertAt(1, 3);
    test.insertAt(2, 1);
    test.insertAt(6, 11);   

    cout <<"Size " << test.getSize() << "\n";
    for(int i = 0; i < test.getCapacity(); i++) {
        cout << test.get(i) << ", ";
    }
}

我期待像5,3,1,0,0,0,11,0这样的东西 但我只得到5,3,1,0所以它永远不会扩展数组,但它会增加大小(元素数量)。

1 个答案:

答案 0 :(得分:0)

您没有发布extendArray()功能,但即使你说它extendArray(int)的副本首先似乎正在更新p_capacity,当你提供的后者没有。

修复会在输出5, 3, 1, 0, 0, 0中获得几个额外的零,因为您只扩展到索引而不是index+1。此外,在insertAt(int index, const T &m_element)中,您正在递增p_size,而不是将其分配给index+1

扩展到p_size+1并修正p_size作业,打印5, 3, 1, 0, 0, 0, 11,我不太确定你是如何得出结论的,它应该有一个额外的尾随0为{{1最终为7,无论初始值是1,2还是4,如我在链接的代码片段中那样。

我也注意到了几个错误,我没有看得太近:你的循环不应该转到p_capacity,而应转移到p_size,所以改为p_size-1它应该是for (size_t i = 0; i <= p_size; i++)

我还建议使用unsigned int(或size_t)而不是int来进行索引,因为当你做一些可能导致负索引的事情时,它允许获得编译器警告。

最后,您应该能够使用unique_ptr::swap来避免在extendArray(..)中进行两次分配。

学习好运!