Как напечатать вектор в обратном порядке? - PullRequest
1 голос
/ 20 июня 2020

У меня есть вектор (v), элементы которого упорядочены от самого низкого до самого высокого. Чтобы напечатать элементы в обратном порядке (от высшего к низшему), я решил написать этот код:

void highest_lowest(int v[], int size) {
    int i;

    for (i = size; i >= 1; i--) {
        printf("v[%d] = %d\n", i, v[i]);
    }
}

, но он печатает следующее:

v[4] = 2003516626
v[3] = 6422476
v[2] = -2
v[1] = 6422108

Кто-нибудь знает где ошибка ??

Ответы [ 4 ]

2 голосов
/ 20 июня 2020

Индекс должен быть от size-1 до 0 включительно. Идиоматический c способ записать это l oop:

void highest_lowest(int v[], int size) {
    for (int i = size; i-- > 0;) {
        printf("v[%d] = %d\n", i, v[i]);
    }
}

Пост-декремент i в тесте имеет 2 преимущества:

  • i это инициализируется размером массива, а не size-1.
  • i может иметь беззнаковый тип, например size_t, что сделает тест i >= 0 неработоспособным.
1 голос
/ 20 июня 2020

В массивах / векторах индекс идет от 0 до (size-1) или array_length -1.

В вашем решении / коде первая итерация для l oop началась с size который находится за пределами вектора!

v[size] выходит за границы вектора!

Мы можем получить последний элемент в векторе с помощью выражения: v[size-1]

другая проблема, вы не распечатали первый элемент, потому что остановились на i = 1

void highest_lowest(int v[], int size){
  
  for(int i = size-1; i >= 0; --i){
    printf("v[%d] = %d\n", i, v[i]);
  }

}
0 голосов
/ 21 июня 2020

В C индексы массива начинаются с 0, переменная массива содержит адрес первого элемента,

*array-----+
           |
           V
          +-+-+-+-+
          |1|2|3|4|
          +-+-+-+-+

, что означает, что если вы добавите 1 к этому адресу (array [1]), вы получите второй элемент , а не первый

array[1]-----+
             |
             V
          +-+-+-+-+
          |1|2|3|4|
          +-+-+-+-+

Это означает, что вы начинаете отсчет от «size - 1» до «0» , отсчитывая от «size» вы выходите за пределы границ массива

0 голосов
/ 20 июня 2020

Вы также можете использовать reverse_iterators.

for (auto it=v.rbegin(); it!=v.rend(); it++)
{
   std::cout << *it << std.endl
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...