可以捕获std :: vector的重新分配吗?

时间:2019-02-25 23:17:49

标签: c++ vector stl realloc

我知道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()并毫不恐惧地使用指针。

1 个答案:

答案 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()迭代器,而不是进行任何此类操作。