2017-11-25 94 views
0

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

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

'for(int i = 0; i <= p_size ...'A'for'循环使用'<='会产生红色标记,这些红色标记是错误的。自己的类而不是使用'std :: vector'? – PaulMcKenzie

+1

'if(index> = p_capacity)extendArray(index);'假设您有2个元素数组,索引0和1。这个索引作为新的大小,并最终... ...相同的2元素数组。什么是捕获? –

+0

是纠正了循环。我只是学习的东西,认为让我自己的类工作类似于std: :vector会教会我一些构造函数使得p_capacity = 2如果我想在索引4处插入它不存在的东西(index> capacity)这就是为什么我想调整我的数组的大小首先是容量可以包含给定的索引 – Emdzej93

回答

0

您没有发布您的extendArray()函数,但即使您说它是extendArray(int)的副本,但是当您提供的后者没有时,您似乎首先会更新p_capacity。

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

延伸到p_size+1和固定p_size分配,版画5, 3, 1, 0, 0, 0, 11,我不太清楚你是如何得出的结论,它应该有一个额外的尾随0,因为p_capacity最终为7,无论初始值是1,2或4,就像我在代码片段中放入链接一样。

我还注意到几个错误我的没有看太接近:你的循环不应该去p_size,而是p_size-1,这样反而for (size_t i = 0; i <= p_size; i++)应该for (size_t i = 0; i < p_size; i++)

我也建议使用无符号整型(或size_t)而不是int来进行索引,因为这样可以在您执行某些可能会导致负指数的事情时收到编译器警告。

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

祝你好运!