如何正确/有效地处理指向std :: vector元素的指针?

时间:2018-03-20 12:41:09

标签: 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,这不起作用。

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

提前致谢

2 个答案:

答案 0 :(得分:2)

  

每个所有者都可以使用该指针访问向量中的其他元素。

除了一个可怕的想法,你可以用std::list来实现它,但是:

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

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

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

答案 1 :(得分:1)

如果你需要随机访问但是你需要容器​​增长而不会使元素的指针/引用/迭代器失效,那么你可以使用std::deque。这将让你从正面或背面增长/缩小。如果你从中间插入/擦除虽然仍然可以使迭代器无效。