向量的数据方法有一些错误

时间:2019-01-30 03:56:43

标签: c++11

我在C ++中使用vector的数据方法,但是有一些问题,代码在下面:

#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 :(得分:3)

具有视觉效果:

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)的一种较短方法是很有帮助的。

答案 1 :(得分:1)

因为您正在修改p本身。

++p之后(我记得您相当于p = p + 1)之后,p指向索引为1的元素,因此p[2]指向元素的索引从向量的开头开始在索引3处,这就是为什么要更改第四个元素的原因。

答案 2 :(得分:1)

++p之后,指针p指向myvector [1]。

那么我们有:

  • p[0]指向myvector[1]
  • p[1]指向myvector[2]
  • p[2]指向myvector[3]