c++;删除动态数组的最后一个元素 在C++中,我使用了n个元素< /p>的动态数组。 int* a = new int[n];

c++;删除动态数组的最后一个元素 在C++中,我使用了n个元素< /p>的动态数组。 int* a = new int[n];,c++,dynamic,dynamic-memory-allocation,delete-operator,C++,Dynamic,Dynamic Memory Allocation,Delete Operator,左移该数组的所有元素后,最后一个元素,即[n-1]无效,我想删除它。 右移之后,我需要删除数组的第一个元素,并有一个指向第二个元素的指针,也就是说,我需要创建一个长度为n-1的数组。 如何才能做到这一点?您需要分配一个新数组,并将原始数组的元素复制到新数组中 这是一个演示程序 #include <iostream> #include <utility> #include <algorithm> size_t shift_left( int * &a,

左移该数组的所有元素后,最后一个元素,即[n-1]无效,我想删除它。 右移之后,我需要删除数组的第一个元素,并有一个指向第二个元素的指针,也就是说,我需要创建一个长度为n-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;
}
您可以按以下方式更改函数。当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::ValSux。

C++没有新的/删除等价于C的代码> RealCalc<代码>。所以简单的回答是,你没有。您可以创建一个新数组、复制、删除[]旧数组,等等。或者您首先应该使用的方法:使用
std::vector
。当然,您正在某处跟踪
n
。没有什么能阻止你减少
n
上限,忽略你有一个额外的、现在未使用的插槽。如果你将你的方法与
std::vector
进行比较:
std::vector
保留两个值:size和capacity,其中size是正在使用的元素数,capacity是分配的元素数。因此,使用例如
std::vector::pop_back()
删除最后一个元素可能只会导致大小减小(一种非常便宜的操作)。当然,大小必须始终是“动态数组”中的“动态”仅指您在运行时选择大小这一事实,但是一旦创建,大小是固定的。如果您想要“大小可以动态更改”中的“动态数组”,您需要使用
std::vector
(或者自己构建一个,不推荐)
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;
}