首页 > 解决方案 > 可以捕获 std::vector 的重新分配吗?

问题描述

我知道 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() 并毫无畏惧地玩指针。

标签: c++vectorstlrealloc

解决方案


恕我直言,最简单的方法是让你的 vectorwithhook::push_back 返回新的 end() 并像这样使用它:

指针 = v.push_back(new_item);

注意:您必须对所有更改向量内容的成员执行此操作(例如 emplace_back、pop_back、insert 等...)

或者,也应该可以通过创建自己的分配器类型,它将在构造函数中引用迭代器和容器,并在每次分配器::分配(...)或分配器::dellocate(...)叫做。请注意,这违背了 STL 的原则,该原则旨在使迭代器、容器、分配器彼此分离......

PS 这听起来都不是一个好主意,我会考虑重新编写代码以避免保留 end() 迭代器而不是做任何这些。


推荐阅读