正在从c++中的数组中删除元素
Deleting element from an array in c++
我读过其他人的帖子,但他们没有完全回答我的问题。我正在学习从书中删除数组中的元素,并尝试应用该代码。据我所知,我传错了数组,或者它是按地址发送整数(不知道这背后的含义)。
#include <iostream>
#include <cstdlib>
using namespace std;
void delete_element(double x[], int& n, int k);
int main()
{
// example of a function
int mass[10]={1,2,3,45,12,87,100,101,999,999};
int len = 10;
for(int i=0;i<10;i++)
{
cout<<mass[i]<<" ";
};
delete_element(mass[10],10&,4);
for(int i=0;i<10;i++)
cout<<mass[i]<<" ";
return 0;
}
void delete_element(double x[], int& n, int k)
{
if(k<1 || k>n)
{
cout<<"Wrong index of k "<<k<<endl;
exit(1); // end program
}
for(int i = k-1;i<n-1;i++)
x[i]=x[i+1];
n--;
}
您的代码中有几个错误。我强调了一些有问题的主要问题1-3:
- 您调用
exit
,它不提供任何对象的正确清理,因为它是从C继承的。这在这个程序中没有什么大不了的,但它将变成一个
处理此类错误的一种适当方法是抛出异常cout<<"Wrong index of k "<< k <<endl; exit(1);
应该是这样的:throw std::runtime_error("invalid index");
应该在其他地方处理。 - 您将函数参数声明为接受
int&
,但您调用函数如下:delete_element(mass[10],10&,4);
10&
正在传递10
的地址。只需传递值10
即可 - 您正在从原始C数组中"删除"一个函数。这本身就没有意义。实际上,您不能删除这样一个数组的一部分。它是在堆栈上创建的恒定编译时大小。函数本身不进行任何删除,请尝试将函数命名为更面向任务的名称
- 您正在使用C阵列。除非你有充分的理由,否则不要这样做。使用
std::array
或std::vector
。这些容器知道自己的大小,vector管理自己的内存,并且可以毫不费力地重新调整大小。有了容器,您还可以访问STL的全部范围,因为它们支持迭代器
我建议您重写代码,实现某种类型的STL容器
第15行:语法错误你不能传递一个数字&如果你想通过引用传递,你需要首先创建一个变量,比如:
delete_element函数签名与声明的数组冲突。请使用双数组或int数组,并确保签名匹配。
delete_element(mass, len , 4);
当您编写不带括号的数组的名称时,它与&质量[0]即指向第一个元素的指针。
完整的更改应该是:
#include <iostream>
#include <cstdlib>
using namespace std;
void delete_element(int x[], int& n, int k);
int main(){
// example of a function
int mass[10] = { 1, 2, 3, 45, 12, 87, 100, 101, 999, 999 };
int len = 10;
for (int i = 0; i<10; i++){ cout << mass[i] << " "; };
cout << endl;
delete_element(mass, len , 4);
for (int i = 0; i<10; i++)cout << mass[i] << " ";
cout << endl;
cin.ignore();
return 0;
}
void delete_element(int x[], int& n, int k){
if (k<1 || k>n){
cout << "Wrong index of k " << k << endl;
exit(1); // end program
}
for (int i = k - 1; i<n - 1; i++)
x[i] = x[i + 1];
n--;
}
您的程序中有几个错误。除了一些语法问题外,您还试图将int
数组传递给需要double
数组的函数。
不能传递int
文本的左值引用。您想要的是传递一个对int
数组长度的引用。另请参阅http://en.cppreference.com/w/cpp/language/reference.
这是您的程序的更新版本。
#include <iostream>
#include <cstdlib>
using namespace std;
void delete_element(int x[], int& n, int k);
int main() {
// example of a function
int mass[10] = { 1,2,3,45,12,87,100,101,999,999 };
int len = 10;
for (int i = 0;i < len;i++)
cout << mass[i] << " "; ;
cout << endl;
delete_element(mass, len, 4);
for (int i = 0;i < len;i++) // len is 9 now
cout << mass[i] << " ";
cout << endl;
return 0;
}
void delete_element(int x[], int& n, int k) {
if (k<1 || k>n) {
cout << "Wrong index of k " << k << endl;
exit(1); // end program
}
for (int i = k - 1;i<n - 1;i++)
x[i] = x[i + 1];
n--;
}
虽然它不能直接回答您的问题,但我想向您展示如何使用C++以更简单的方式解决您的问题。
#include <vector>
#include <iostream>
void delete_element(std::vector<int>& v, const unsigned i)
{
if (i < v.size())
v.erase(v.begin() + i);
else
std::cout << "Index " << i << " out of bounds" << std::endl;
}
int main()
{
std::vector<int> v = {1, 2, 3, 4, 5, 6, 7};
delete_element(v, 4);
for (int i : v)
std::cout << i << std::endl;
return 0;
}
不能从数组中删除元素,因为数组的大小是固定的。考虑到这一点,delete_element
的实现只需对适当的算法函数std::copy进行一次调用即可完成。
此外,我强烈建议您将要删除的元素设置为基于0的值,而不是基于1的值。
另一个注意事项:不要在函数调用的中间调用exit()
。
#include <algorithm>
//...
void delete_element(int x[], int& n, int k)
{
if (k < 0 || k > n-1 )
{
cout << "Wrong index of k " << k << endl;
return;
}
std::copy(x + k + 1, x + n, x + k);
n--;
}
移除第一个元素的实例
std::copy
调用将元素从源范围(由k
之后的元素和最后一个项目(用n
表示)定义)移动到目的地范围(k
处的元素)。由于目的地不在源范围内,因此std::copy
调用工作正常。
- 将数组的地址分配给变量并删除
- 你能帮我解决删除数组 c++ 中重复值的挑战吗?
- 如何在C++中删除静态数组?
- 删除指针数组 (C++) 中的元素
- 删除动态数组时未定义标识符
- 在命令行上将输入显示到数组中时如何删除 ./a.out?
- C++数组删除的例外
- C++:指向对象的指针数组 - 删除元素时程序崩溃>
- 你如何打印出使用数组删除某些字符的回文
- 类数组 - 删除操作
- 何时从数组删除类指针
- 从自定义数据类型向量数组C 删除
- 动态数组删除
- 动态数组C++(删除)
- 动态数组删除旧指针并将其设置为新数组C++
- C++ 字符数组删除重复字符
- 使用数组删除记录
- 数组删除导致EXC_BAD_ACCESS错误
- 为什么常规删除运算符在需要数组删除运算符时起作用
- 智能指针数组删除器