【问题标题】:Delete element from C++ array从 C++ 数组中删除元素
【发布时间】:2010-10-26 11:01:03
【问题描述】:

请告诉我如何从 C++ 数组中删除元素。

我的老师将它的值设置为 0,对吗?

【问题讨论】:

  • 你能提供一些代码来说明吗? 删除到底是什么意思?
  • 你的意思是删除关键字delete吗?或者你的意思是简单地从数组中删除一个元素?你有指针数组还是对象数组?
  • 您将不得不提供一些代码来阐明您的意思。 “C++”数组在技术上与 C 数组没有什么不同:例如int foo[30]; 但是在 C++ 中实现数组有很多不同的方法。
  • 它是一个简单的购物账单系统......人们可以从存储在数组中的产品列表中删除购买的产品......
  • @Krishna:您需要显示一些代码。 不能“将数组设置为 0”。但是,可以将指向(可能是动态分配的)数组中第一个元素的指针设置为0。一个人可以做各种各样的其他事情。所以您需要向我们展示一些代码,否则您可能不会得到有意义的答案。

标签: c++ arrays


【解决方案1】:

如果您说的是普通数组,例如

int array[100];

那么你不能“删除”一个元素,因为数组总是有 100 个元素(在这个例子中)。

所以这取决于你的程序对数组值的解释。如果您的老师一直使用 0 值来表示不存在的元素,那么一切都会正常工作,因此与任何其他方法一样正确。

【讨论】:

  • 他不能放一个指向最后一个元素的指针,然后调用“删除指针”吗?
【解决方案2】:

你不能真正从 C++ 数组中“删除”一个元素。

但是,如果数组由指针组成,则可以删除特定元素指向的对象。

在你的老师的例子中,重要的是要注意数组的对象是否是动态分配的(在 C++ 中使用 new 运算符)。他可能只是将他的值设置为0,作为该值不再有效的指示。

没有实际的源代码,我能帮到你的就这么多了。

【讨论】:

    【解决方案3】:

    如果数组不打算排序,一个快速简单的方法是将最后一个元素复制到要删除的元素的位置,然后将元素计数减1。

    【讨论】:

      【解决方案4】:

      可以从向量中删除一个元素,使该元素不再存在,而所有其他元素移动一个位置。

      struct counter
      {
         int x;
         int operator()() { return x++; }
         counter() : x(0) {}
      };
      
      std::vector<int> v;
      std::generate_n( std::back_inserter(v), 8, counter() );
      std::copy(v.begin(), v.end(), std::ostream_iterator<int>(cout, " "));
      std::cout << '\n';
      v.erase( v.begin() + 4 );
      
      std::copy(v.begin(), v.end(), std::ostream_iterator<int>(cout, " "));
      std::cout << '\n';
      

      应该输出:

      0 1 2 3 4 5 6 7

      0 1 2 3 5 6 7

      (假设包括所有必要的标头和主要功能体等)。

      请注意,如果您有一个使用 new 分配的指针向量,您可能必须在指针从向量中删除之前调用 delete。 (这取决于向量是否管理这些指针的生命周期)。如果您有 boost::shared_ptr 的向量,则无需管理删除。

      【讨论】:

      • re: 您的counter 谓词:该标准不保证谓词的复制频率。您需要将可变状态外部化,例如通过在外部声明 int xcounter 只存储对它的引用。仍然存在应用顺序问题,但对于std::generate 来说可能不是问题。学术论文:gotw.ca/gotw/052.htm
      【解决方案5】:
         :
          int main()
      {   
          int a[100],x,i;
          cout<<"enter the no. of elements(max 100): ";
          cin>>x;
          for(i=0;i<x;i++)
          {
              cout<<"enter "<<i+1<<" element: ";
              cin>>a[i];
              cout<<endl;
          }
          cout<<"your array: "<<endl;
          for(i=0;i<x;i++)
          {
              cout<<a[i]<<endl;
          }
          cout<<"enter the element you want to delete: ";
          int b,flag,pos;
          cin>>b;
          for(i=0;i<x;i++)
          {
              if(b==a[i])
              {
                  flag=1; pos=i;
              }
              else
              {
                  flag=0;
              }
          }
          if(flag==0)
          {
              cout<<"element not found nothing to delete....";
          }
          for(i=0;i<x-1;i++)
          {
              if(i<pos)
              {
                  a[i];
              }
          else if(i>=pos)
          {
              a[i]=a[i+1];
          }
          }
          cout<<"new array:"<<endl;
          for(i=0;i<x-1;i++)
          {
              cout<<a[i]<<endl;
          }
          return 0;
      }
      

      【讨论】:

      • 这段代码没有正确缩进,开头有一个冒号。您还应该解释,这是通过将在您删除的元素右侧找到的元素向左移动来实现的,因此您需要跟踪数组的当前长度。另外,如果有人能做到这一点,首先使用std::vector 会更好。
      【解决方案6】:

      将其设置为零仍会在您遍历数组或通过索引访问它时显示该零。如果您不想这样做,则必须将删除的元素之后的所有元素复制到数组的开头。

      【讨论】:

        【解决方案7】:

        1) 如果你有一个指针数组,那么像这样:

        // to create an array :
        std::vector< int* > arr( 10, NULL );
        for ( std::vector< int* >:iterator it=arr.begin; arr.end() != it; ++ it )
        {
          *it = new int( 20 );
        }
        // to delete one element
        delete( arr.at(3) );
        

        对该数组元素的任何访问在形式上都是 c++ 标准未定义的行为。甚至赋值为NULL,像这样:

        arr.at(3) = NULL;
        

        2)如果你真的必须使用指针,那么使用智能指针(这个特定情况需要shared_ptr):

        std::vector< std::shared_ptr< int > > arr;
        

        【讨论】:

          【解决方案8】:
          scanf("%ld",&x);//x position where we have to delete
          if(x==n-1) {
             n-=1;
          
          }
          else {
             n-=1;
             for (int i = x; i < n; i++) {
                  /* code */
                  A[i]=A[i+1];
             }
          }
          

          【讨论】:

          • 代码需要一些注释,回答需要一些解释。
          【解决方案9】:

          这是一个老话题,但我会把这个答案放在这里给最近看到这个问题的人!

          从数组中删除元素是一项繁重的操作,您可以使用索引轻松跟踪元素。无论如何,只要您想删除vector 的第一个x 元素,就可以调用此函数。

          vector<int> remove_frist_x_items(const vector<int>& arr, int x)
          {
              return vector<int>(arr.begin() + x, arr.end());
          }
          
          // Delete the first element from the array
          auto new_array = remove_frist_x_items(the_old_one, 1);
          

          【讨论】:

            【解决方案10】:

            您可以通过复制除需要删除的元素之外的所有其他元素来创建另一个数组。 只需使用以下代码行删除前一个数组。 (假设 arr_name 是数组的名称。 如果你的数组是这样的,

            int* arr_name = new int[5]; 
            

            然后使用删除它

            delete[] arr_name; 
            

            【讨论】:

              【解决方案11】:
              cin>>n;
              int array[n];
              ...
              ...
              for(int k=0;k<n;k++){
              array[k]=array[k+1];   //overwriting the current element of array with next element
              array[n-1]=0;          //setting last element as 0
              --n;                   //reducing the size of array
              }
              ...
              ...
              

              【讨论】:

                猜你喜欢
                • 2013-03-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-10-31
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多