在稳定向量中使用项的地址

Using the address of an item in stable vector

本文关键字:地址 向量      更新时间:2023-10-16

std::vector中的项目是动态分配的,当重新分配发生时,它们的地址可能会改变。因此,不可能依赖它们的地址,因为它不稳定。

另一方面,如果我有一个包含一些项目的std::vector,并且我无意在其生命周期内更改有关它的任何内容,那么使用其项目的地址是否有效(定义良好)?

例:

std::vector<foo> foos;
foos.reserve(100);
for(size_t i=0;i<100;++i){
    foos.emplace_back(make_random_foo());
}
//From now no one can touch foos    
auto ptr_to_the_fifth_foo=&foos[4];

换句话说,标准是否保证注意会影响向量项地址,因为我不是自己做的?

如果没有调用std::vector的成员函数,则向量可能根本不会更改,因此内容保持不变,所有指针都保持有效。

在您的示例中,您调用标准中定义为等效于 *(a.begin() + n)operator[](size_type n)

std::vector是一个容器,因此,容器要求包含以下状态:

除非另有指定(显式或通过根据其他函数定义函数),否则调用容器成员函数或将容器作为参数传递给库函数不应使该容器中的对象的迭代器无效或更改其值。

由于未指定begin()以使容器的任何迭代器失效,因此operator[]也不会。

是的。

仅当元素的迭代器失效时,对元素的指针和引用才会失效。

当容量必须增长(当大小超过容量时),或者当您在矢量中在该元素之前插入/删除元素时,迭代器将失效。 当容器移入或移出时,它们也可能失效,但可能不会发生。

我相信 swap 被指定为不会使迭代器失效,而是使它们引用"新家"的位置(因此,"新向量"中指向"新家"的指针/引用)(即,缓冲区所有权更改)。 移动分配不做出此承诺。 我不记得我的头顶是否移动结构。