【发布时间】:2015-08-03 00:32:24
【问题描述】:
我做了一些研究,发现
就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问它们的元素,并且与在数组中一样有效。
所以如果vector 保证使用连续存储,那么使用这样的代码是安全的:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> V = { 4, 2, 8, 4, 4, 6 };
for (auto &i : V)
{
cout << i << "(pos " << (&i - &V.front()) << ")" << endl;
}
return 0;
}
我是对的还是我做出了错误的假设?该代码有效。问题是它是否能保证工作。 foreach 非常实用,唯一的问题是获取元素的相对位置。
那么,是否可以安全地使用指向向量元素的指针来确定其在容器中的位置?
【问题讨论】:
-
@awesomeyi 谢谢。我想只要我小心一点就安全了。
-
@LHLaurini 如果您抓住这些指针并调整向量的大小,您的代码可能会严重失败。如果您的真正目标是稍后引用这些指针,则不应指向向量中的位置。我假设您的程序比这个玩具示例大得多。
-
@PaulMcKenzie 是的,我知道。我实际上对这个问题有一些经验。解决了它存储索引而不是指针的问题(我想我也可以使用迭代器,来看看)。这实际上不是问题所在,但无论如何谢谢。
-
@LHLaurini 要安全地确定位置,请使用
std::distance。过度指针化代码通常会导致禁用编译器可以执行的优化。
标签: c++ pointers vector foreach