在if语句上重新初始化数组
我正在编写管理对象的动态数组的类。现在我遇到了应该在给定索引处插入元素的方法,但在它检查索引是否不比数组容量大之前。然后它应该先调整数组大小。在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所以它永远不会扩展阵列,但它增加的大小(数元件)。
回答:
您没有发布您的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(..)中的两个分配。
祝你好运!
以上是 在if语句上重新初始化数组 的全部内容, 来源链接: utcz.com/qa/257144.html