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;
};
答案 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
项目(即插入计数)不同的密钥的节点将在有序遍历中连续,这意味着
所以,在内部你有类似
的东西 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
的迭代器。