gpt4 book ai didi

c++ - 如何扩展标准库容器以在更改单个元素时得到通知

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:50 25 4
gpt4 key购买 nike

我想扩展标准库容器,以便在容器状态发生变化时通知应用程序。例如,当一个新项目被添加到列表中时,我希望容器使用某些信息调用应用程序中的方法。我的要求是跟踪哪些内存地址因给定操作而发生更改。例如,如果插入一个新元素导致列表内部的某个对象发生修改,我想知道该对象的起始地址以及对象的大小,以便我大致知道该对象的哪个区域内存变了。

更新:看来我的问题不是很清楚。我不想拦截调用以获取值。相反,我想要的是跟踪内存是如何因操作而改变的。例如,当一个新元素添加到二叉树时,树中某个节点中的指针会更新以指向新添加的节点。发生这种情况时,我想收到有关此节点地址以及节点类大小的通知,因此我可以放心地说,start_address 到 start_address + sizeof(NodeType) 范围内的内存地址已更改。在自定义内存池 + 自定义分配器的帮助下,我可以使用此信息进行增量状态转储。

最佳答案

我不喜欢您给出的将地址返回到列表中的内部存储器位置的示例。如果您有不同的线程使用可能失效的迭代器,您可以锁定容器直到该任务完成。

另一个例子,当容器分配更多存储时通知,是可以的。这是一个非常简单的例子。我只实现了 push() ,它在底层 vector 上调用 push_back 。您甚至无法访问已推送的数据,但您可以轻松添加。

template <class T>
class notifyvector {
std::vector<T> _vector;
size_t _capacity;
static const size_t initial_capacity = 20;

public:
notifyvector() : _capacity(initial_capacity) {
_vector.reserve(initial_capacity);
}

void push(T value){
_vector.push_back(value);
if (_capacity < _vector.capacity()){
// the vector has grown
_capacity = _vector.capacity();
do_notify(_capacity);
}
}

void do_notify(size_t newcap){
// all you
std::cout << "the vector has grown to " << newcap << std::endl;
}
};

练习的重点是演示一个包装器,该包装器在一个控制底层容器的所有输入和输出的类中提供您想要的通知类型。这允许它检测事件并发送您想要的任何通知。

您可能允许访问底层容器的 const 引用(只读),并检测您想要在写访问中通知的事件,这必须通过容器的函数。

关于c++ - 如何扩展标准库容器以在更改单个元素时得到通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38621878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com