Справка по сортировке слиянием C ++ Динамически выделяет временный массив для объединенных чисел - PullRequest
0 голосов
/ 02 декабря 2019

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

void Merge(int *numbers, int i, int j, int k)
{
int mergedSize = k - i + 1;         
int merge2 = k - j;
int mergePos = 0;                       
int leftPos = 0;                       
int rightPos = 0;                     
int mergedNumbers = new int[mergedSize];    
leftPos = i;                        
rightPos = j + 1;     

Я получаю ошибку int, говорящую, что я не могу инициализировать сущность типа int в "int mergedNumbers = newИНТ [mergedSize]; ". Как я могу это исправить, чтобы заставить его работать.

1 Ответ

1 голос
/ 02 декабря 2019

new возвращает указатель на первый элемент выделенного массива. Вы пытаетесь присвоить его int, который не является указателем.

Вы должны присвоить результат выражения new указателю на int:

int* mergedNumbers = new int[mergedSize];

или более просто, вы можете позволить компилятору определять тип, так что вам не нужно вводить его дважды:

auto mergedNumbers = new int[mergedSize];

Обратите внимание, однако, что mergedNumbers является указателем в любом случае и должен бытьиспользуется как таковой (например, с синтаксисом индекса массива).

Не забудьте delete[] указатель, когда вам больше не нужен выделенный массив, в противном случае вы теряете эту память:

delete[] mergedNumbers;

Однако для временного массива динамического размера нельзя использовать ручную динамическую память, вместо этого следует использовать std::vector<int>. Использование new / delete для чего-то подобного является плохим стилем, поскольку он подвержен ошибкам, не безопасен для исключений и не следует одной из фундаментальных концепций стиля программирования C ++, известного как Приобретение ресурсов является инициализацией(RAII)

std::vector<int> mergedNumbers(mergedSize);

Используйте это, если можете (требуется #include<vector>). Если ваш инструктор не допустит этого, это будет очень прискорбно, потому что он научит вас плохому стилю C ++, который не используется на практике.

...