正在从c++中的数组中删除元素

Deleting element from an array in c++

本文关键字:数组 删除 元素 c++      更新时间:2023-10-16

我读过其他人的帖子,但他们没有完全回答我的问题。我正在学习从书中删除数组中的元素,并尝试应用该代码。据我所知,我传错了数组,或者它是按地址发送整数(不知道这背后的含义)。

#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

  1. 您调用exit,它不提供任何对象的正确清理,因为它是从C继承的。这在这个程序中没有什么大不了的,但它变成一个

    处理此类错误的一种适当方法是抛出异常
    cout<<"Wrong index of k "<< k <<endl; exit(1);
    应该是这样的:
    throw std::runtime_error("invalid index");
    应该在其他地方处理。
  2. 您将函数参数声明为接受int&,但您调用函数如下:delete_element(mass[10],10&,4); 10&正在传递10地址。只需传递值10即可
  3. 您正在从原始C数组中"删除"一个函数。这本身就没有意义。实际上,您不能删除这样一个数组的一部分。它是在堆栈上创建的恒定编译时大小。函数本身不进行任何删除,请尝试将函数命名为更面向任务的名称
  4. 您正在使用C阵列。除非你有充分的理由,否则不要这样做。使用std::arraystd::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调用工作正常。