Что не так с выводом этой попытки динамического изменения размера массива? - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь динамически изменить размер массива в C ++ и прохожу шаги, но выходные данные не совпадают с числами, которые я помещаю в массив. Сначала я создаю новый массив большего размера, затем копирую все элементы исходного массива, затем добавляю другой элемент в новый массив, удаляю старый массив и устанавливаю указатель старого массива на новый массив.

Я не уверен, должен ли я возвращать указатель, потому что параметр передается по ссылке, верно?

#include <iostream>

using namespace std;

void resize( int*, int, int );

int main()
{
        int *arr = new int[5];
        for( int i=0; i<5; i++ )
                arr[i] = i;
        for( int i=0; i<5; i++ )
                cout << arr[i];
        cout << endl;


        resize( arr, 5, 5 );
        for( int i=0; i<6; i++ )
                cout << arr[i] << endl;
        cout << endl;
        return 0;
}


void resize( int *arr, int size, int yes )
{
        int *newA = new int[size+1];
        for( int i=0; i<size; i++ )
        {
                cout << arr[i];
                newA[i] = arr[i];
        }
        delete [] arr;
        newA[size] = yes;
        arr = newA;
}

Это вывод:

002340

но я хочу, чтобы новый массив был 0 1 2 3 4 5

1 Ответ

0 голосов
/ 30 апреля 2019

Вы передаете значение arr как указатель, а не как ссылку.Мы можем изменить resize для передачи указателя по ссылке, просто добавив &:

// Passes the pointer to 'arr' by reference
void resize(int*& arr, int size, int yes )
{
        int *newA = new int[size+1];
        for( int i=0; i<size; i++ )
        {
                cout << arr[i];
                newA[i] = arr[i];
        }
        delete [] arr;
        newA[size] = yes;
        arr = newA;
}

При этом в стандартной библиотеке есть встроенный класс, который уже делает это!Он называется std::vector, и он хорошо собран, так же быстро, как обычный массив (когда вы компилируете с оптимизацией), и он автоматически удаляет всю память, которую он выделяет!

С std::vector, исходный кодвыглядит так:

int main()
{
    std::vector<int> arr(5); // Create a vector with 5 elements

    // Assign them
    for(int i=0; i<5; i++ )
        arr[i] = i;
    // Print them
    for( int i=0; i<5; i++ )
        cout << arr[i];
    cout << endl;

    // add the number 5 at the end of arr
    // resize happens automatically
    arr.push_back(5); 

    // The number 5 now appears at the end of the array
    for( int i=0; i<6; i++ )
        cout << arr[i] << endl;
    cout << endl;
    return 0;
}
...