c++ - 存储指向固定大小 vector 内的元素的指针

标签 c++ iterator stdvector

我无法说服自己,存储指向vector.end()的指针是安全的
(即无论 vector end()迭代器返回什么)

数据是

std::vector<unsigned char> data;
auto end = &(*data.end());
block b(end, size);
blocks.push_back(b);
data.insert(data.end(), (unsigned char*) ptr_data, (unsigned char*) ptr_data + size);

我的问题是。该地址是否可以更改(&*(data.end()),并且条件是必须预先分配 vector 容量,并且客户端插入的 vector 永远不能超过要存储的 vector 。

因此,它应该是内存中的连续区域,因此我的假设是vector将不执行任何备忘操作,因此我可以存储指向不同元素的指针。
(因此这里块存储了指向data.end()所指向的指针(在插入数据 vector 之前)
以及有关该数据 vector 中可变大小数据的元数据。

谢谢。

最佳答案

只要没有获得invalidated,就可以安全地存储诸如std::vector::end()之类的迭代器。有很多无效规则,但是它的要点(与示例有关)是可以的,直到您按下push_back()为止:

blocks.push_back(b);

此调用使迭代器无效,因为它会调整其大小。您将需要再次获取blocks.end()才能使其生效。

需要注意的一件事是,您可能不应该取消引用end()It is unsafe。但是,您拥有的用例与this problem with regular arrays非常相似。那解决了规则数组,而不是 vector ,但是我想它会非常相似。

长话短说,如果您将数组元素末尾的1用作地址,则可能会或可能会将其视为未定义的行为,并且将其视为标准中的缺陷。

相反,您实际上不需要存储被取消引用的迭代器的地址,只需存储迭代器即可:
auto end = data.end();

迭代器的设计类似于指针,因此没有真正的理由在这里获得一个地址。

关于c++ - 存储指向固定大小 vector 内的元素的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59415891/

相关文章:

c++ - 尝试创建线程安全的 std::map

c++ - 如何从 sk_buff 获取 IP 选项?

c++ 项目,vs2010, "build failed"没有错误

Java - 迭代器 : "Syntax error, parameterized types are only available if source level is 5.0"

c++ - 从 std::vector 查找 std::map 中的对象

dll - DLL和EXE之间包含vector <T>不同大小的结构大小

c++ - 在 C 或 C++ 中处理循环依赖的最佳方法?

loops - 引用的生命周期比相同范围内的值短?

c++ - 使用迭代器删除元素,不知道 vector

c++ - 为什么这个函数会产生不正确的值?