是否可以安全地使用指向向量元素的指针来确定其在容器中的位置?

Posted

技术标签:

【中文标题】是否可以安全地使用指向向量元素的指针来确定其在容器中的位置?【英文标题】: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 非常实用,唯一的问题是获取元素的相对位置。

那么,

【问题讨论】:

见this answer @awesomeyi 谢谢。我想只要我小心一点就安全了。 @LHLaurini 如果您抓住这些指针并调整向量的大小,您的代码可能会严重失败。如果您的真正目标是稍后引用这些指针,则不应指向向量中的位置。我假设您的程序比这个玩具示例大得多。 @PaulMcKenzie 是的,我知道。我实际上对这个问题有一些经验。解决了它存储索引而不是指针的问题(我想我也可以使用迭代器,来看看)。这实际上不是问题所在,但无论如何谢谢。 @LHLaurini 要安全地确定位置,请使用std::distance。过度指针化代码通常会导致禁用编译器可以执行的优化。 【参考方案1】:

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

【讨论】:

以上是关于是否可以安全地使用指向向量元素的指针来确定其在容器中的位置?的主要内容,如果未能解决你的问题,请参考以下文章

C++简单实现vector

我可以直接从 C++ 中向量元素的指针获取索引吗?

在删除指向动态分配对象的指针向量中的元素之前,我需要做啥?

C++:指向向量(及其元素)的指针是不是稳定,因为随着向量的增长,向量将在内存中迁移以适应更多元素? [复制]

我是不是保证在移动向量后指向 std::vector 元素的指针有效?

如何访问包含指向字符串的指针的向量的元素?