Реверс массива С++

398
05 августа 2017, 04:47

Покажите пожалуйста как это сделать красиво используя стандартный массив, очень смущает int *_arr = new int[len]; <- вообще честно говоря жутковатый синтаксис, объясните его пожалуйста, почему нельзя просто написать int _arr[len];

Почему место for (int i = 0; i < len; i++) _arr[i] = arr[i]; я не могу просто передать копию _arr = arr ?

include <iostream>
using std::cout;
using std::endl;
void reversed(int *arr, int len);
int main() {
    int arr[] = { 1,2,3,4,5,6,7,8,9 };
    reversed(arr, 9);
    for (int i = 0; i < 9; i++) cout << arr[i];

    getchar();
}
void reversed(int *arr, int len) {
    int *_arr = new int[len];
    for (int i = 0; i < len; i++) _arr[i] = arr[i];
    for (int i = 0; i < len; i++) {
        arr[i] = _arr[(len - 1) - i];
    }
}
Answer 1

почему нельзя просто написать int _arr[len];

В языке С++ размеры в объявлениях массивов должны быть Целочисленными Константными Выражениями, т.е. попросту выражаясь целыми константами времени компиляции. В вашем случае len не является константой времени компиляции. Это означает, что объявить массив int _arr[len] вы не сможете. Создать массив размера len в С++ можно только через динамическое выделение памяти, либо явно (напр. через new[]), либо неявно (напр. через std::vector).

Однако задача реверса массива запросто решается in-place, без заведения дополнительного массива-копии. Поэтому метод создания дополнительного массива к данной теме не должен иметь никакого отношения вообще.

Answer 2
@AnT Спасибо за наводку.

Так можно делать без копии массива:

void reversed(int *arr, int len) {
        for (int i = 0, j = len - 1; i<j; i++, j--){
            arr[i] = arr[i] + arr[j];
            arr[j] = arr[i] - arr[j];
            arr[i] = arr[i] - arr[j];
        }

    }
READ ALSO
C2664: &ldquo;BOOL PlaySoundA (LPCSTR,HMODULE,DWORD)&rdquo;: невозможно преобразовать аргумент 1 из unsigned char в LPCSTR

C2664: “BOOL PlaySoundA (LPCSTR,HMODULE,DWORD)”: невозможно преобразовать аргумент 1 из unsigned char в LPCSTR

Есть массив, который я пытаюсь проиграть через PlaySoundA

218
C++ illegal in base/member initializer list

C++ illegal in base/member initializer list

Возникает ошибка illegal in base/member initializer list при объявлении переменных в конструктореЛибо я не понимаю как это работает

230
Structured bindings

Structured bindings

Стандарт C++17 вводит новый элемент синтаксиса под названием structured bindingsВ скором времени применение этой фичи может стать широко распространённым...

286
С++ исключение при рекурсии [требует правки]

С++ исключение при рекурсии [требует правки]

Ошибка при рекурсиb, когда входное число больше или равно +-5000, как исправить?

239