使用 std::vector::data() 访问元素

mah*_*ood 0 c++ pointers stdvector

对于这段代码,我使用data()向量的方法来访问其元素:

#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;
}
Run Code Online (Sandbox Code Playgroud)

这会产生

myvector contains: 10 20 0 100 0
Run Code Online (Sandbox Code Playgroud)

问题是为什么p[2]是0?假设myvector.data()是一个指向第一个元素(索引 0)的指针,那么p[0]就是 10 就可以了。++p指向下一个元素,即p[1]20,这也很好。现在,p[2]是 后的下一个元素p[1]。所以,顺序应该是10 20 100。这里有什么错误吗?

ypn*_*nos 7

您增加p1,然后写入p[2],现在实际上是myvector[3]

写入p[1]将会写入与 相邻的字段*p


Som*_*ude 7

您将指针初始化p为指向myvector[0]

然后你增加p,所以现在它指向myvector[1]

如果我们把它画出来,那就是这样的:

+-------------+-------------+-------------+-------- ------+-------------+
| 我的矢量[0] | 我的矢量[1] | 我的矢量[2] | 我的矢量[3] | 我的矢量[4] |
+-------------+-------------+-------------+-------- ------+-------------+
                ^
                |
                p

现在是重要的部分:对于任何指针或数组p和索引i,表达式完全p[i]等于。*(p + i)

这意味着p[2]您的代码与*(p + 2). 由于p指向向量的第二个元素,p + 2因此将指向第四个元素。

再次把它画出来:

+-------------+-------------+-------------+-------- ------+-------------+
| 我的矢量[0] | 我的矢量[1] | 我的矢量[2] | 我的矢量[3] | 我的矢量[4] |
+-------------+-------------+-------------+-------- ------+-------------+
                ^^^^
                | | | |
                pp + 1 p + 2 p + 3

因此,当您写入p[2]then 时,它与写入 to 相同myvector[3]