从C ++数组中删除元素

时间:2010-10-26 11:01:04

标签: c++ arrays

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

我的老师将其值设置为0,这是正确的吗?

11 个答案:

答案 0 :(得分:8)

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

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

在老师的情况下,重要的是要记录数组的对象是否是动态分配的(使用C ++中的new运算符)。他可能只是将其值设置为0,作为该值不再有效的指标。

如果没有实际的源代码,这就是我可以帮助您的。

答案 1 :(得分:2)

如果你在谈论一个普通的阵列。例如

int array[100];

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

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

答案 2 :(得分:2)

可以从向量中移除元素,使元素不再存在,所有其他元素都会移位。

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的向量,你将不需要管理删除。

答案 3 :(得分:1)

如果不打算对数组进行排序,则可以快速简便地将最后一个元素复制到要删除的元素的位置,然后将元素数减少1.

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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;

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

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

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);

答案 9 :(得分:0)

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

int* arr_name = new int[5]; 

然后使用

将其删除
delete[] arr_name; 

答案 10 :(得分:-2)

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