c++ - 如何正确/高效地处理指向 std::vector 元素的指针?

标签 c++ iteration invalidation

假设我们有:

std::vector<Segment*> segments;
...
Segment* dd = new Segment;
segments.emplace_back(dd);
Owner*   owner = getOwner();
owner->setSegmentPointer(&(segments.back());

由于 Iterator invalidation rules 这将不起作用.

vector 中添加的任何后续元素 segments将使存储在 owner 中的指针无效.如何避免这个问题保持访问时间std::vector<> ? (假设我们不能提前使用vector.resize)。就是用std::map<>唯一的解决方案?

提前致谢

最佳答案

Each owner can use that pointer to access other elements in the vector.

除了这个想法很糟糕之外,您还可以使用 std::list 实现它,不过:

首先,每个所有者实例都会得到一个指向列表的迭代器,而不是指向段的指针。 std::list 的优点是不会在插入/删除时使迭代器失效,除非您删除迭代器指向的元素。

通过这个迭代器,您可以找到列表中的其他元素。但是,仍然存在一个问题:您需要安全地检测列表的开头和结尾。所以你需要在开始和结束时有标记值,可以是 e。 G。空指针,如果它们没有出现在列表中。

一个重要的注意事项:如果您需要从列表中删除一个段,尽管所有者仍然有一个迭代器,您需要找到一种方法来通知所有者迭代器失效。没有办法自动完成这项工作!

关于c++ - 如何正确/高效地处理指向 std::vector 元素的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49384517/

相关文章:

c++ - 模态对话框打开时无法聚焦 Firemonkey 应用程序,除非单击模态对话框本身

c++ - 常量表达式中的非文字类型 'compare'

c# - 如何实现递归回调模式?

java - 确定哪些用户的 session 已失效

c++ - 使用 CGAL 库构建 Visual C++ 应用程序

c++ - 1 智能感知 : no suitable constructor exists to convert from "bool" to "std::basic_string<char, std::char_traits<char>, std::allocator<char>>"

jQuery 为它找到的每个元素返回两个元素?

c - 如何用递归替换 For 循环

c# - InvalidateVisual 是否以惰性方式工作?

reactjs - 在react-cache/suspense中unstable_createResource失效