12

我见过我团队中的人编写这样的代码。我个人认为这不是可移植的,因为向量可以以完全不同的方式实现。我对吗?

vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);

int* b = &a[0];
std::cout<< *(b +1); // this will print 2
4

2 回答 2

21

该代码是正确的。std::vector从C++03 开始​​,保证存储在 a 中的元素是连续存储的。

这是当前标准 C++ 草案N3797(23.3.6.1)的相关部分:

向量是支持随机访问迭代器的序列容器。此外,它还支持(摊销)恒定时间的最后插入和擦除操作;在中间插入和擦除需要线性时间。存储管理是自动处理的,但可以给出提示以提高效率。向量的元素是连续存储的,这意味着如果 v 是一个向量,其中 T 是 bool 以外的某种类型,那么它服从&v[n] == &v[0] + n 所有的恒等式0 <= n < v.size()

于 2013-11-01T13:47:12.350 回答
8

无论以何种方式实现向量,标准都保证某些事情保持一致。Astd::vector总是连续存储在内存中,这就是它可以与随机访问迭代器一起工作的原因。

于 2013-11-01T13:48:10.387 回答