在稳定向量中使用项的地址
Using the address of an item in stable 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];
换句话说,标准是否保证注意会影响向量项地址,因为我不是自己做的?
如果没有调用std::vector
的成员函数,则向量可能根本不会更改,因此内容保持不变,所有指针都保持有效。
在您的示例中,您调用标准中定义为等效于 *(a.begin() + n)
的 operator[](size_type n)
。
std::vector
是一个容器,因此,容器要求包含以下状态:
除非另有指定(显式或通过根据其他函数定义函数),否则调用容器成员函数或将容器作为参数传递给库函数不应使该容器中的对象的迭代器无效或更改其值。
由于未指定begin()
以使容器的任何迭代器失效,因此operator[]
也不会。
是的。
仅当元素的迭代器失效时,对元素的指针和引用才会失效。
当容量必须增长(当大小超过容量时),或者当您在矢量中在该元素之前插入/删除元素时,迭代器将失效。 当容器移入或移出时,它们也可能失效,但可能不会发生。
我相信 swap 被指定为不会使迭代器失效,而是使它们引用"新家"的位置(因此,"新向量"中指向"新家"的指针/引用)(即,缓冲区所有权更改)。 移动分配不做出此承诺。 我不记得我的头顶是否移动结构。
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- C++ 将地址保存为字符串的向量转换为新的向量
- 指向结构的指针向量的元素具有相同的地址
- 为什么迭代向量在 c++ 中给出固定地址?
- 获取向量中元素的地址
- pthread_mutex_t向量为所有互斥锁提供了相同的地址
- 类对象指针的向量:如何在指针地址获得价值?C 和SDL_RECT
- 循环向量引起的地址边界错误
- 在向量 (C++) 中保留插入元素的地址
- 在 c++ 中按地址传递向量
- 尝试将派生类对象地址分配给基类指针的向量
- 获取数组/向量末尾地址的未定义行为
- 获取 STL 向量C++的地址
- 将二进制文件读取到向量元素的地址中
- C 方法地址向量
- 是否可以在结构构造中将self的地址推送到向量
- 将对象的地址推送到向量后更改对象
- 将指针从一个向量复制到另一个向量;地址指出了变化
- 将对象的地址添加到循环中的向量中
- 在字符串向量中创建20000个MAC地址