【问题标题】:Can pointers to a vector element be used safely to determine its position in the container?是否可以安全地使用指向向量元素的指针来确定其在容器中的位置?
【发布时间】:2015-08-03 00:32:24
【问题描述】:

我做了一些研究,发现

就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问它们的元素,并且与在数组中一样有效。

来源:http://www.cplusplus.com/reference/vector/vector/

所以如果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


【解决方案1】:

可能是安全的,但不是很好。结果真正依赖于分配器/迭代器的实现细节。您可以定义自己的分配器,理论上不遵循连续存储。请使用Iterator计算相对位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2011-03-12
    • 2011-07-08
    • 1970-01-01
    相关资源
    最近更新 更多