【问题标题】:How do i delete/insert an element of an array in C++如何在 C++ 中删除/插入数组的元素
【发布时间】:2012-08-03 06:51:27
【问题描述】:

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

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

非常感谢

【问题讨论】:

  • i == n - 1: arr[i] = arr[i + 1]; 时循环越界
  • C 和 C++ 是两种不同的语言。这个问题是关于什么的?另请注意,您的代码示例既不是有效的 C 也不是 C++。

标签: c++ c arrays visual-c++


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    使用矢量

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

    【讨论】:

      【解决方案3】:

      移动

      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; 
      

      【讨论】:

        【解决方案4】:

        第一个问题的问题是你在 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
        

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            当您在代码中移动元素时,您所做的正是如此 - 移动。这些操作不会释放或添加任何“内存”;

            如果由于此类插入/删除操作而确实需要更改数组的大小,您将必须分配一个适当大小的新数组并将旧数组中的数据复制到那个新的(如果合适的话,记得释放第一个数组不再使用的内存)。

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

            旁注:虽然您的第一个代码正在移动元素并在该内存块的末尾留下一个未使用的“尾部”,但第二个示例将访问 为该数组分配的内存块之外的内存,导致内存访问冲突(并且很可能导致任何体面的操作系统终止您的程序)

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

                猜你喜欢
                • 2015-04-16
                • 2021-06-06
                • 1970-01-01
                • 1970-01-01
                • 2012-03-29
                • 2010-10-04
                • 2020-02-14
                • 2013-03-27
                相关资源
                最近更新 更多