c ++ удалить последний элемент динамического массива - PullRequest
2 голосов
/ 28 сентября 2019

В c ++ я взял динамический массив из n элементов

int* a = new int[n];

После смещения влево всех элементов этого массива последний элемент, то есть a [n-1], бесполезен, и я хочу удалитьЭто.И после сдвига вправо мне нужно удалить первый элемент массива и иметь указатель на второй элемент, т.е. мне нужно сделать массив длиной n-1.Как я могу это сделать?

1 Ответ

1 голос
/ 28 сентября 2019

Вам необходимо выделить новый массив и скопировать элементы исходного массива в новый массив.

Вот демонстрационная программа

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

...