[英]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而其余元素将被移动到左侧。
至于第二个问题:你必须创建一个更大的新数组来添加任何东西。
您需要的是malloc
, calloc
和free
函数。 一般来说,熟悉它们和动态分配。 一般的想法是malloc
或calloc
是一个比当前数组大一号的数组,将元素复制到你想要插入另一个元素的空间,插入那个元素,然后复制数组的其余部分。 之后,不要忘记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;
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.