c++ - 可以捕获 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() 并毫无畏惧地玩指针。
解决方案
恕我直言,最简单的方法是让你的 vectorwithhook::push_back 返回新的 end() 并像这样使用它:
指针 = v.push_back(new_item);
注意:您必须对所有更改向量内容的成员执行此操作(例如 emplace_back、pop_back、insert 等...)
或者,也应该可以通过创建自己的分配器类型,它将在构造函数中引用迭代器和容器,并在每次分配器::分配(...)或分配器::dellocate(...)叫做。请注意,这违背了 STL 的原则,该原则旨在使迭代器、容器、分配器彼此分离......
PS 这听起来都不是一个好主意,我会考虑重新编写代码以避免保留 end() 迭代器而不是做任何这些。
推荐阅读
- javascript - 我如何动态获得前 3 或 5 个财政年度。例如 2021-20、2020-19
- xamarin - Quickblox.sdk GetBaseSession() 方法抛出“nonce is required”错误
- javascript - 笑话覆盖工具失败
- windows - 如何在 Windows 上编译 Hello World 程序集?
- php - 检查一个单词是否有多个大写字母,并且只更改只有一个大写的单词(并且是第一个字母)
- ffmpeg - ffmpeg 静音音频
- c# - HTTP GET 返回列表枚举 .Net Core
- java - XML 覆盖组件 Java
- alexa - Alexa 模型评估效果很好,但在模拟器或 Alexa 设备中从未调用过意图
- javascript - 在 react-native 中按下硬件后退按钮时无法对同一组件执行 2 个操作,以下是有关后处理程序的代码