繁体   English   中英

如何在C ++中删除/插入数组元素

[英]How do i delete/insert an element of an array in C++

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

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

非常感谢

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

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

第一个问题中的问题是你在for循环的每次迭代中将数组的最后一个元素设置为0,所以在循环的第一次传递之后,它将是{1, 2, 4, 4, 0} ,下一个{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而其余元素将被移动到左侧。

至于第二个问题:你必须创建一个更大的新数组来添加任何东西。
您需要的是malloccallocfree函数。 一般来说,熟悉它们和动态分配。 一般的想法是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

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

移动

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; 

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

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

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

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

当您在代码中移动元素时,您正在做的就是 - 移位。 这些操作没有释放或添加“内存”;

如果您真的需要通过这种插入/删除操作来更改数组的大小, 必须分配一个适当大小的新数组,并将旧数组中的数据复制到新数组中(并记住释放第一个数组的不再使用的内存,如果合适的话)。

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

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

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

使用矢量

#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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM