我正在编写管理动态对象数组的类。现在我遇到了应该在给定索引处插入元素的方法,但在检查该索引是否不比数组容量大之前。然后它应该首先调整数组大小。
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所以它永远不会扩展数组,但它会增加大小(元素数量)。
答案 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(..)中进行两次分配。
学习好运!