C ++:STXXL中的哪种数据类型适合创建外部存储器二进制搜索树?

时间:2015-06-04 06:01:38

标签: c++ pointers vector binary-search-tree stxxl

我想创建一个外部存储器二进制搜索树数据结构,其数据位于外部存储器中,使用 stxxl 作为库。

为此,STXXL中的哪种数据类型适合用作树中的节点。如果我们使用stxxl:Vector作为树的节点,我们如何保持指向它们的指针。

我已阅读过STXXL:Vector文档,显然不可能使用Pointers这是非常合乎逻辑的理解。

  

警告:       不要存储对外部向量元素的引用。在以下任何访问期间,此类引用可能会失效   向量的元素。

然后,问题是使用' stxxl'来保存二进制搜索树数据结构的替代方法。数据类型?

2 个答案:

答案 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),因此您可以将其视为不会失效的指针。