我知道std :: vector上的push_back()会导致重新分配,因此会使指针中的迭代器无效。有没有办法在重新分配上安装钩子(大概很少发生),以便我可以适当地调整迭代器?
理想情况是这样的:
class hook; // forward
std::vectorwithhook<T,hook> v;
auto pointer = v.end();
template<> class hook<T> {
void operator()(T *old, T *new) { pointer += new-old; }
}
然后我可以在v上push_back()并毫不恐惧地使用指针。
答案 0 :(得分:0)
恕我直言,最简单的方法是让vectorwithhook :: push_back返回新的end()并像这样使用它:
pointer = v.push_back(new_item);
注意:您必须对所有更改向量内容的成员(例如emplace_back,pop_back,insert等...)执行此操作
或者,也可以通过创建自己的分配器类型来实现,该类型将引用迭代器和构造函数中的容器,并在每次allocator :: allocate(...)或allocator :: dellocate()时对其进行更新。 ..) 叫做。请注意,这违反了STL的原理,STL的原理是将迭代器,容器,分配器彼此分开...
P.S。所有这些听起来都不是一个好主意,我会考虑重新编写代码,以避免保留end()迭代器,而不是进行任何此类操作。