C++ std::vector::data 为什么返回的指针索引和 vector 索引不匹配?

标签 c++ c++11 vector

<分区>

我在 http://www.cplusplus.com/reference/vector/vector/data/ 中找到了一个 std::vector 的例子.

// vector::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;
}

结果是

myvector contains: 10 20 0 100 0

我的问题可能很愚蠢,但我真的不明白这里发生了什么。我们得到了一个指向 vector 内存的直接指针。然后我们为第一个元素(索引 0)分配值 10,移动到第二个元素并为其分配值 20(索引 1)。最后,我们为第三个元素(索引 2)分配值 100。答案应该如下吗?

10 20 100 0 0

最佳答案

这张图可能有助于解释

int* p = myvector.data();
[   ] [   ] [   ] [   ] [   ]
  ^

*p = 10;
[10 ] [   ] [   ] [   ] [   ]
  ^

++p;
[10 ] [   ] [   ] [   ] [   ]
        ^

*p = 20;
[10 ] [20 ] [   ] [   ] [   ]
        ^

p[2] = 100; // [2] is relative to where p is
[10 ] [20 ] [   ] [100] [   ]
        ^

关于C++ std::vector::data 为什么返回的指针索引和 vector 索引不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46881204/

相关文章:

c++ - 我怎样才能在 CUDA 中比较很多 vector (有效地)

c++ - 在 Visual Studio Code 中编译 C++ 代码

c++ - 是否可以定义指向构造函数的函数指针?

c++ - C++动态加载简介

c++ - 在函数模板中打包扩展调用模板化方法

c++ - `std::normal_distribution` 是否保证标准偏差为 0?

c++ - LLDB 在 C++ 类虚方法中不显示变量值

c++ - OS X Yosemite gcc 无法识别的命令行选项 'mdll' 在 brew install gcc 之后

c++ - C++ STL vector 保留太多容量会消耗大量内存吗?

c++ - VS2012 中不允许使用 {...} 进行 vector <字符串> 初始化?