【发布时间】:2018-05-24 01:18:04
【问题描述】:
我有一个简单的程序来向数组中添加一个元素:
void printArray(int inp[], int size)
{
cout << "[";
for (int i = 0; i < size - 1; i++)
{
cout << inp[i] << ", ";
}
cout << inp[size - 1] << "]" << endl;
}
int addElement(int inputArray[], int inputSize, int element, int atIndex)
{
int cur = inputSize;
while (cur >= 0)
{
if (cur == atIndex)
{
inputArray[cur] = element;
return inputSize + 1;
}
inputArray[cur] = inputArray[cur - 1];
cur--;
}
return inputSize + 1;
}
int arr1[] = {1, 5, 9, 2};
int arr2[] = {1, 5, 9, 2};
int main()
{
int arraySize = sizeof(arr1) / sizeof(arr1[0]);
addElement(arr1, arraySize, 7, 0);
printArray(arr1, arraySize + 1);
printArray(arr2, arraySize);
return 0;
}
这个输出:
[7, 1, 5, 9, 2]
[2, 5, 9, 2]
虽然我没有接触过arr2,但它已被修改。我认为是因为arr1 和arr2 在内存中是连续分配的,并且天真地向arr1 添加一个元素会覆盖arr2[0]。
我应该如何处理这种情况,只有在下一个空间未使用时才添加,否则将整个数组移动到另一个位置?
【问题讨论】:
-
安全的做法是不去做。使用
std::vector -
重新发明轮子是很好的了解事情是如何运作的。但这对生产代码没有意义。因此,如果您尝试了解 std::vector 的工作原理,那么您就走对了。是的,如果你没有空间fpr新数据,你必须分配新的内存,将整个内容复制到新的地方,然后把新的数据放在那里。这还需要对元素使用复制构造等。 std::vector 提供的所有内容。
-
感谢您指出我需要做的事情。我只是在练习,不是为任何项目写这个。
-
@Klaus 如何检查我是否没有空间存储新数据?还是每次添加元素时都应该将其复制到新位置?
-
为了检查是否没有剩余空间,您应该存储阵列容量。没有别的办法。