C ++中的有序树

时间:2016-06-14 22:55:23

标签: c++ boost stl tree

C ++ STL显然缺少有序的树数据结构。见here。 Boost也缺少一个有序树,但它确实有一个" un"有序树Property Tree,其中数据按插入顺序排列。我希望订单与记忆无关。

Property Trees上的boost页面说明这是概念上的boost :: ptree结构。

struct ptree
{
   data_type data;                         // data associated with the node
   list< pair<key_type, ptree> > children; // ordered list of named children by insertion
};

我想扩展提升以跟踪秩序。

这是正确的方法吗?

class ordered_ptree : public boost::property_tree::ptree {
public:
  ordered_ptree(int id) : _id{id}{};

 protected:
  int _id;
};

1 个答案:

答案 0 :(得分:2)

(根据你问题中的评论,我知道你想要像Python OrderedDict这样的东西,但要考虑密钥和相对顺序。)

由于标准库(或者增强型)容器都不是您想要的,因此您可能需要扩展std::map(特别是如果您不需要全部界面)。

假设您从

开始
template<
    typename Key, 
    typename Value, 
    class Compare=std::less<Key>,
    class Alloc=std::allocator<pair<const Key, Value> >
class ordered_map
{
    // This needs to be filled.
};

现在在里面,你可以拿着一个插入计数器:

    std::size_t m_ins_count;

初始化为0并在每次插入时递增。

在内部,您的新密钥将是原始密钥的std::pair和插入计数。 binary search trees的标准属性意味着具有仅与第二个pair项目(即插入计数)不同的密钥的节点将在有序遍历中连续,这意味着

  1. 您保留不同密钥的顺序
  2. 您保留在密钥中插入的顺序
  3. 操作是对数时间
  4. 遍历相同的关键项是(摊销)线性时间
  5. 所以,在内部你有类似

    的东西
        typedef
            std::map<
                std::pair<Key, std::size_t>,
                Value,
                lex_compare<Compare>,
                std::allocator<std::pair<std::pair<Key, std::size_t>,     Value> >
            internal_map_t;
    

    (其中lex_compare<Compare>首先按给定的仿函数进行比较,然后按插入索引进行比较。

    现在,您可以选择一个(最小的)界面,并通过在&#34;外部世界&#34;中翻译键来实现它。和内心世界中的键对+插入指数&#34;这棵树

    如果您打算同时提供迭代器接口,您可能会发现boost iterator library很有用,因为您只想修改std::map的迭代器。