Рука, выполняющая вектор C ++ - PullRequest
0 голосов
/ 06 октября 2018

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

void data(vector<double> &data, int idx, double value)
{
  data.push_back(value);

  if (idx >= data.size() - 1) return;
  if (idx < 0) idx = 0;

  for(int i = data.size() - 1; i > idx; i--)
  {
    data[i] = data[i -1];
    data[i - 1] = value;
  }

}

Набор данных, который я использую:

[4, -6, 0, 8, -7]
idx: 2
value: -7

Таким образом, значение -7 - это то, что push_back в концевектор

Я думаю, я кое-что понял, data.size() - 1 означает последний элемент в массиве, и если idx больше или равен последнему элементу, вернуть это значение?Кажется, цикл for повторяется в обратном направлении.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018
if (idx >= data.size() - 1) return;

На самом деле вы проверяете, что индекс не находится за пределами массива.data.size() - 1 - последний элемент, поэтому idx может быть не более, чем вторым последним элементом.Мы увидим, почему это.

if (idx < 0) idx = 0;

Если индекс ниже 0, просто установите его в 0 для доступа к первому элементу

for(int i = data.size() - 1; i > idx; i--)

Вы начинаете с индекса последнегоэлемент, и до тех пор, пока он больше, чем idx, вы продолжаете другую итерацию (и уменьшаете ее).Итак, в вашем примере у вас будет две итерации с i = 4 и i = 3. idx подобен нижней исключительной границе

data[i] = data[i -1];
data[i - 1] = value;

Сначала вы копируете предыдущий элемент в текущий, а затем значение (-7 в вашем случае) к предыдущему элементу.Таким образом, в последней итерации i-1 будет таким же, как idx.И из-за того, что idx не может быть последним элементом, потому что тогда цикл не будет введен.

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

0 голосов
/ 06 октября 2018

Если ваша задача - выяснить цель этого алгоритма, прочитайте этот ответ.

Давайте сначала рассмотрим ваш пример:

std::vector<double> a{ 4, -6, 0, 8, -7 };
data(a, 2, -7);

Результат: 4, -6, -7, 0, 8, -7

Должно быть ясно, что data(vec, idx, val) вставляет val в vec, так что это элемент idx th , а vec увеличивает его размер на 1. Если idx находится вне диапазона, он устанавливается на 0 (если < 0) или vec.size() (если >= vec.size().)

Редактировать:

Визуализация:

Изначально: 4, -6, 0, 8, -7, -7

Первая итерация I = data.size() - 1 = 5:
4, -6, 0, 8, -7, -7 (data[5] = data[4])
4, -6, 0, 8, -7, -7 (data[4] = value)

(Примечание: здесь-7 = -7 ничего не меняется)

Вторая итерация I = 4:
4, -6, 0, 8, 8, -7 (data[4] = data[3])
4, -6, 0, -7, 8, -7 (data[3] = value)

Третья итерация I = 3:
4, -6, 0, 0, 8, -7 (data[3] = data[2])
4, -6, -7, 0, 8, -7 (data[2] = value)

Сейчас I = 2, более.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...