我想要创建一个外部内存二进制搜索树数据结构,其数据位于外部内存中,使用stxxl作为库。
为此,STXXL中的哪个数据类型适合用作树中的节点。如果我们使用stxxl:Vector作为树的节点,我们如何保存指向它们的指针。
我在STXXL:向量文档中读到,显然不可能使用指针,这是非常合乎逻辑的理解。
警告:不存储对外部向量元素的引用。在对向量元素的任何后续访问过程中,此类引用可能无效。
那么问题是,使用'stxxl‘数据类型保存二进制搜索树数据结构的替代方案是什么?
发布于 2015-06-04 06:16:30
存储指向元素的迭代器,而不是指向元素的指针/引用。指针/推荐将因从磁盘分页而失效,但迭代器不会失效。
例如:
// Safe to store this, not safe to store &nodes[node_index].
stxxl::vector<Node>::iterator node_it = nodes.begin() + node_index;..。和const_iterator的只读目的。
除非删除元素,否则node_it不会失效。与STL不同的是,如果您执行push_back这样的操作,它甚至不会失效。删除它将将页写入/读取磁盘(只读取const_iterator),因此您可以将其视为不会失效的指针。
发布于 2015-06-04 06:16:16
您可以在节点结构中直接保留stxxl::向量。但是,在使用和遍历节点时,需要返回向量的引用,而不是向量本身。如果你直接返回向量,你将深拷贝它是不可行的。从现有节点返回引用是一种安全的使用方法:
const stxxl::vector<int> &Node::getVectorFromNode() const
{
return _VectorNodeMember;
}https://stackoverflow.com/questions/30636076
复制相似问题