如何处理 correctly/efficiently 指向 std::vector 元素的指针?
How to handle correctly/efficiently pointers to std::vector elements?
假设我们有:
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<>
是唯一的解决办法吗?
提前致谢
如果您需要随机访问,但又需要容器在不使元素 pointers/references/iterators 失效的情况下增长,那么您可以使用 std::deque
。这将使您从前面或后面 grow/shrink。如果你从中间 insert/erase 仍然可以使迭代器无效。
Each owner can use that pointer to access other elements in the vector.
除了这个想法很糟糕之外,您还可以通过 std::list
实现它,不过:
首先,每个所有者实例都会得到一个指向列表的迭代器,而不是指向段的指针。 std::list
的优点是不会使 insertion/deletion 上的迭代器失效,除非您删除迭代器指向的元素。
通过这个迭代器,您可以找到列表中的其他元素。但是,仍然存在一个问题:您需要安全地检测列表的开头和结尾。所以你需要在开始和结束时有标记值,可以是 e。 G。空指针,如果它们没有出现在列表中。
一个重要说明:如果您需要从列表中删除一个段,尽管所有者仍然有它的迭代器,您需要找到一种方法来通知所有者迭代器失效。无法自动完成此操作!
假设我们有:
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<>
是唯一的解决办法吗?
提前致谢
如果您需要随机访问,但又需要容器在不使元素 pointers/references/iterators 失效的情况下增长,那么您可以使用 std::deque
。这将使您从前面或后面 grow/shrink。如果你从中间 insert/erase 仍然可以使迭代器无效。
Each owner can use that pointer to access other elements in the vector.
除了这个想法很糟糕之外,您还可以通过 std::list
实现它,不过:
首先,每个所有者实例都会得到一个指向列表的迭代器,而不是指向段的指针。 std::list
的优点是不会使 insertion/deletion 上的迭代器失效,除非您删除迭代器指向的元素。
通过这个迭代器,您可以找到列表中的其他元素。但是,仍然存在一个问题:您需要安全地检测列表的开头和结尾。所以你需要在开始和结束时有标记值,可以是 e。 G。空指针,如果它们没有出现在列表中。
一个重要说明:如果您需要从列表中删除一个段,尽管所有者仍然有它的迭代器,您需要找到一种方法来通知所有者迭代器失效。无法自动完成此操作!