2

所以第一个问题,我在这里有这个数组:

arr[] = {1; 2; 3; 4; 5}

如果我输入例如:3 第三个元素将被删除并替换为下一个值。像这样:

arr[] = {1; 2; 4; 5}

我在这里得到了这个代码:

for(int i = 2; i < n; i++)
{
    arr[i] = arr[i + 1];
    arr[n - 1] = 0;
}

但结果是

arr[] = {1; 2; 4; 0; 0}

请修复代码

第二个问题,我也将输入“3”,但不是删除第三个元素并替换它,而是插入一个新的第三个元素,即“50”,以便:

arr[] = {1; 2; 3; 4; 5}

会变成:

arr[] = {1; 2; 50; 3; 4; 5}

我仍然是编程和 C++ 的菜鸟,这是我的第一个问题,所以请好好回答:D

非常感谢

4

7 回答 7

7

不,元素永远不会被“删除”。数组大小在编译时确定,并将被固定。

如果您需要在运行时调整数组大小,请考虑改用std::vector

于 2012-08-06T09:51:57.100 回答
2

第一个问题的问题是您将数组的最后一个元素设置为 0 for 循环的每次迭代,因此在您的循环第一次通过后,它将是{1, 2, 4, 4, 0}, next {1, 2, 4, 0, 0}
只需将arr[n - 1] = 0;for 循环放在外面就足够了。同样:
编辑:更新循环控制语句,使其不会越界,感谢 hmjd

for(int i = 2; i < n-1; i++) 
{
    arr[i] = arr[i + 1];   
}
arr[n - 1] = 0;

该元素本身不会被删除,它只会被设置为 0,其余的将向左移动。

至于第二个问题:您必须创建一个更大的新数组才能添加任何内容。
您需要的是malloc,callocfree函数。熟悉它们和一般的动态分配。一般的想法是malloccalloc一个比当前数组大一号的数组,将元素复制到要插入另一个元素的空间,插入该元素,然后复制数组的其余部分。之后,不要忘记free旧数组并将其设置为指向新数组的指针。

int size = 4;
int arr[] = (int *) calloc(size, sizeof(int));
int insertTo = 2;
int insert = 50;
int tempArr[] = (int *) calloc(size+1, sizeof(int));
for(int i = 0, int j = 0; i < size; i++, j++) {
    if(j == insertTo) {
        tempArr[j] = insert;
        i--; //to offset the cycle incrementation
    } else {
        tempArr[j] = arr[i];
    }
}
free(arr);
arr = tempArr;
size++; // Don't forget to update the size

为简洁起见,省略了分配检查。
第一个问题可以使用类似的方法来更改数组的大小。

于 2012-08-06T10:11:00.357 回答
1

移动

arr[n - 1] = 0; 

循环后得到1;2;4;5个;0:

for(int i = 2; i < n - 1; i++)
    arr[i] = arr[i + 1];
arr[n - 1] = 0; 
于 2012-08-06T09:54:42.747 回答
1

使用标准 C++ 库函数插入或删除数组元素并调整其大小。

对于在数组中插入元素std::vector::insert

用于从数组std::vector::erase中删除或擦除元素

于 2017-01-23T20:00:21.613 回答
0

arr[] = {1; 2; 3; 4; 5}将分配足够的内存来容纳 5 个(不少于,不多)整数值。

当您在代码中移动元素时,您就是在这样做 - 移动。这些操作不会释放或添加“内存”;

如果由于此类插入/删除操作而确实需要更改数组的大小,则必须分配一个适当大小的新数组并将旧数组中的数据复制到新数组中(并记住释放第一个数组的不再使用的内存,如果合适的话)。

欢迎使用 C++,工程师负责管理资源(与许多脚本或其他“高级”语言不同)。

旁注:虽然您的第一个代码正在移动元素并在该内存块的末尾留下一个未使用的“尾巴”,但第二个示例将访问超出为此数组分配的内存块的内存,从而导致内存访问冲突(以及更多比任何体面的操作系统都可能终止您的程序)

于 2012-08-06T09:55:32.660 回答
0

如果您使用的是 C++,那么您可以使用标准模板库中的容器。您在代码示例中使用的数组是 C 样式的数组。虽然在 C++ 代码中使用 C 风格的数组是完全可以接受的,但使用 std::vector 会更好,因为它在运行时调整数组大小方面具有更大的灵活性。在大多数情况下,C 样式数组和 std::vector 之间的性能差异可以忽略不计。

于 2012-08-06T09:56:23.730 回答
0

使用向量

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

template<typename T>
void print(const vector<T> &v){
    typename vector<T>::const_iterator it;
    for(it=v.begin(); it!=v.end(); ++it)
        cout << *it << ' ';
    cout << endl;
}

int main (){
    const int arr[] = {1, 2, 3, 4, 5};
    const int size = sizeof(arr)/sizeof(int);

    vector<int> v(&arr[0], &arr[size]);

    v.erase(v.begin() + 2);
    print(v);//1 2 4 5

    v.insert(v.begin()+2, 3);
    print(v);//1 2 3 4 5
    v.insert(v.begin()+2, 50);
    print(v);//1 2 50 3 4 5
}
于 2012-08-09T15:18:38.750 回答