Разыменование указателя на член

У меня есть структура C++, которая имеет динамически распределенный массив в качестве указателя. У меня есть функция для обратного массива, но он не работает (я думаю, потому что временная переменная указывает на исходное значение).

struct s {

   int *array;
   int length;

   ...

   s(int n) {
       this->array = new int[n];
       this->length = n;
   }

   ...

   void reverse() {

       for (int i = 0; i < this->length; i++) {
           int n = this->array[i];
           this->array[i] = this->array[this->length - i - 1];
           this->array[this->length - i - 1] = n;
       }

   }

   ...

}

Я думаю, что это делает this->array[this->length - i - 1] = this->array[i]Следовательно, массив остается неизменным и не переворачивается. Я не знаю, как задерживать указатель массива или как просто принять значение this->array[i] гостиница.

2 ответа

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

Как пример, если вы пытаетесь повернуть вспять [1, 2, 3, 4] ты получаешь

after i = 0: [4, 2, 3, 1]
after i = 1: [4, 3, 2, 1]
--- reversed ---
after i = 2: [4, 2, 3, 1]
after i = 3: [1, 2, 3, 4]
--- back to original ---

Вместо этого просто сделайте свой цикл

for (int i = 0; i < this->length / 2; i++) {
    ...
}

Кстати, использование 2-х индексаторов значительно упростит ваш код:

void reverse()
{
    int limit = length / 2;
    for ( int front = 0 , back = length - 1; front < limit; front++ , back-- )
    {
        int n = array[front];
        array[front] = array[back];
        array[back] = n;
    }

}
Другие вопросы по тегам