C ++删除动态数组的最后一个元素

时间:2019-09-28 10:25:59

标签: c++ dynamic dynamic-memory-allocation delete-operator

在c ++中,我采用了n个元素的动态数组

int* a = new int[n];

左移该数组的所有元素后,最后一个元素,即a [n-1]是无用的,我想删除它。 右移后,我需要删除数组的第一个元素,并有一个指向第二个元素的指针,即我需要制作一个长度为n-1的数组。 我该怎么办?

1 个答案:

答案 0 :(得分:1)

您需要分配一个新数组并将原始数组的元素复制到新数组。

这是一个演示程序

#include <iostream>
#include <utility>
#include <algorithm>

size_t shift_left( int * &a, size_t n )
{
    if ( n )
    {
        int *p = new int [n-1];

        std::copy( a + 1, a + n, p );

        std::swap( a, p );

        delete []p;
    }

    return n == 0 ? n : n - 1;
}

size_t shift_right( int * &a, size_t n )
{
    if ( n )
    {
        int *p = new int [n-1];

        std::copy( a, a + n - 1, p );

        std::swap( a, p );

        delete []p;
    }

    return n == 0 ? n : n - 1;
}

int main() 
{
    size_t n = 10;      
    int *a = new int[n] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    for ( const int *p = a; p != a + n; p++ )
    {
        std::cout << *p << ' ';
    }

    std::cout << '\n';

    n = shift_left( a, n );

    for ( const int *p = a; p != a + n; p++ )
    {
        std::cout << *p << ' ';
    }

    std::cout << '\n';

    n = shift_right( a, n );

    for ( const int *p = a; p != a + n; p++ )
    {
        std::cout << *p << ' ';
    }

    std::cout << '\n';

    delete []a;

    return 0;
}

其输出为

0 1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 

您可以通过以下方式更改功能。当传递的n的值等于1时,只需释放原始指针并将其设置为nullptr。

例如

size_t shift_left( int * &a, size_t n )
{
    if ( n )
    {
        if ( n == 1 )
        {
            delete []a;
            a = nullptr;
        }
        else
        {
            int *p = new int [n-1];

            std::copy( a + 1, a + n, p );

            std::swap( a, p );

            delete []p;
        }               
    }

    return n == 0 ? n : n - 1;
}

您也可以使用标准容器std::vector及其成员函数erase

或者您可以考虑使用std::valarray