метод данных вектора имеет некоторые неправильные - PullRequest
0 голосов
/ 30 января 2019

Я использую метод данных вектора в C ++, но у меня есть некоторые проблемы, код приведен ниже:

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector (5);

  int* p = myvector.data();

  *p = 10;
  ++p;
  *p = 20;
  p[2] = 100;

  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size(); ++i)
    std::cout << ' ' << myvector[i];
  std::cout << '\n';

  return 0;
}

результат равен myvector contains: 10 20 0 100 0, но почему результат не равен myvector contains: 10 20 100 0 0первый *p = 10; равен 10, второй ++p;*p = 20; равен 20, все в порядке, но третий p[2] = 100; должен быть равен 100, но это 0, почему?

Ответы [ 3 ]

0 голосов
/ 30 января 2019

После ++p указатель p указывает на myvector [1].

Тогда имеем:

  • p[0], указывающий на myvector[1]
  • p[1] указывает на myvector[2]
  • p[2] указывает на myvector[3]
0 голосов
/ 30 января 2019

С визуальными эффектами:

std::vector<int> myvector (5);
//   ---------------------
//   | 0 | 0 | 0 | 0 | 0 |
//   ---------------------

int* p = myvector.data();
//   ---------------------
//   | 0 | 0 | 0 | 0 | 0 |
//   ---------------------
//     ^
//     p

*p = 10;
//   ----------------------
//   | 10 | 0 | 0 | 0 | 0 |
//   ----------------------
//     ^
//     p

++p;
//   ----------------------
//   | 10 | 0 | 0 | 0 | 0 |
//   ----------------------
//          ^
//          p

*p = 20;
//   ----------------------
//   | 10 | 20 | 0 | 0 | 0 |
//   ----------------------
//          ^
//          p


p[2] = 100;
//   -------------------------
//   | 10 | 20 | 0 | 100 | 0 |
//   -------------------------
//          ^         ^
//          p         p[2]

Полезно помнить, что p[2] - более короткий способ сказать *(p + 2).

0 голосов
/ 30 января 2019

Поскольку вы сами изменяете p.

После ++p (что, я помню, эквивалентно p = p + 1), p указывает на элемент с индексом 1, поэтому p[2] указывает на элемент с индексом 3 от начала вектора, поэтому вместо него изменяется четвертый элемент.

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