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

时间:2016-03-20 14:49:20

标签: c++ c++11 vector

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];

换句话说,标准是否保证注意会影响矢量项地址,因为我自己没有这样做?

2 个答案:

答案 0 :(得分:3)

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

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

std::vector是一个容器,因此容器需求保持哪个状态:

  

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

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

答案 1 :(得分:1)

指针和元素引用只有在迭代器失效时才会失效。

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

我认为交换是指定给而不是使迭代器无效,而是让它们引用&#34;新家&#34;因为它在哪里(因此,指向/#34;新家&#34;在&#34;新向量&#34;)中的指针/引用(即缓冲区所有权发生变化)。 Move-assign不会做出这个承诺。如果move-construct确实如此,我不记得我的头顶。