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

时间:2016-04-06 14:57:32

标签: c++

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

 bool parse_smt2_commands(cmd_context & ctx, std::istream & is, bool  
 interactive, params_ref const & ps) {
    smt2::parser p(ctx, is, interactive, ps);
    return p();

5 个答案:

答案 0 :(得分:1)

第15行:语法错误 你不能通过一个数字& 如果要通过引用传递,则需要首先创建变量,如:

你的delete_element函数签名与你声明的数组冲突。使用double数组或int数组并确保签名匹配。

delete_element(mass, len , 4);

当你编写没有括号的数组名称时,它与& mass [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--;
}

答案 1 :(得分:1)

您的代码中存在一些错误。我强调了一些主要问题 1-3

  1. 你打电话给exit,它没有提供任何对象的正确清理,因为它是从C继承而来的。这个程序并不是很重要但它会< / em>成为一个。

    处理此类错误的一种正确方法是抛出异常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. 你是&#34;删除&#34;来自原始C数组的函数。这本身并没有意义。您实际上无法删除此类数组的一部分。它具有在堆栈上创建的恒定编译时间大小。函数本身不进行任何删除,尝试将函数命名为面向任务的函数。
  4. 您正在使用C-Arrays。除非你有充分的理由,否则不要这样做。使用std::arraystd::vector。这些容器知道它们自己的大小,矢量管理它自己的内存,并且可以用最小的努力重新调整大小。使用容器,您还可以访问STL的全部范围,因为它们具有迭代器支持。
  5. 我建议你重写代码,实现某种类型的STL容器

答案 2 :(得分:0)

您的计划中有一些错误。 除了一些语法问题,您尝试将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--;
}

答案 3 :(得分:0)

虽然它没有直接回答您的问题,但我想向您展示如何使用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;
}

答案 4 :(得分:0)

您无法从数组中删除元素,因为数组的大小是固定的。鉴于此,只需调用适当的算法函数std::copy即可完成delete_element的实现。

此外,我强烈建议您使元素删除基于0的值,而不是从1开始。

另一个说明:don't call exit() in the middle of a function call

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

Live Example removing first element

std::copy调用将元素从源范围(由k之后的元素和最后一个项目(由n表示))定义到目标范围(元素位于k)。由于目标不在源范围内,std::copy调用可以正常工作。