我想创建一个外部存储器二进制搜索树数据结构,其数据位于外部存储器中,使用 stxxl 作为库。
为此,STXXL中的哪种数据类型适合用作树中的节点。如果我们使用stxxl:Vector作为树的节点,我们如何保持指向它们的指针。
我已阅读过STXXL:Vector文档,显然不可能使用Pointers这是非常合乎逻辑的理解。
警告: 不要存储对外部向量元素的引用。在以下任何访问期间,此类引用可能会失效 向量的元素。
然后,问题是使用' stxxl'来保存二进制搜索树数据结构的替代方法。数据类型?
答案 0 :(得分:1)
您可以直接在节点结构中保留stxxl :: vector。但是,在使用和遍历节点时,您需要返回向量的引用而不是向量本身。如果直接返回向量,则会对其进行深层复制,这是不可行的。从现有节点返回引用是一种安全的使用方法:
const stxxl::vector<int> &Node::getVectorFromNode() const
{
return _VectorNodeMember;
}
答案 1 :(得分:1)
存储指向元素的迭代器而不是指向元素的指针/引用。由于向/从磁盘进行分页,指针/引用将失效,但迭代器不会失效。
例如:
// 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
),因此您可以将其视为不会失效的指针。