【问题标题】:one class for both a set and a dictionary (map)集合和字典的一个类(地图)
【发布时间】:2017-04-09 08:57:31
【问题描述】:

我想同时实现 Hash-Table 和 Ballanced-Binary-Tree(特别是 AVL),以满足 setdictionary(地图)的需求。

对于第一个目的,只有一个 Key 类,对于第二个目的,有 Key 和 Data(或 Value)。

这两个版本共享很多功能(尤其是在树的情况下),所以我真的不想实现两次:

template<class Key> class AVLTree;
template<class Key, class Val> class AVLTree;

我怎样才能优雅地制作一个“HashTable”类和一个“AVLTree”类,具有一个模板签名并将它们用于两种目的(可能使用包装器/派生类[[Un]Ordered]“Set”和“地图”?

(不,我不想使用 STL)

谢谢

【问题讨论】:

    标签: c++ dictionary set containers


    【解决方案1】:

    显而易见的答案是:像 STL 那样做。

    介绍你需要的AVLTree的最一般形式:

    template <class K, class V, class KeyOfValue, class Compare>
    class AVLTree;
    

    (请参阅_Rb_tree_base 作为参考)。在这种情况下,AVLTree 只存储Values。但出于比较值的原因,它能够通过KeyOfValue 对象检索ValueKey

    使用它,您的dictionary 应用程序是显而易见的。然后可以通过对KeyValue 使用相同的类型以及KeyOfValue 的标识来对set 进行建模。 (可能您不想每次都将其拼写出来。只需为此使用包装模板即可。)

    【讨论】:

    • 谢谢,没有考虑KeyOfValue,但它不是假设Value在某种意义上总是包含Key吗?如果我只想制作一个字典,例如日期名称及其数字 {"Sunday" : 1, "Monday" : 2, ... },我必须实现一个函数,通过号码?那么有一本字典有什么意义呢?或者你的意思是我必须从外部使用“pair”作为“Value”(在实例化类时)?
    • 在此示例中,您必须使用 pair&lt;string, int&gt; 作为 Value。是的,这假设 Value 包含您要存储的所有内容。但是恕我直言,这不是问题,因为无论如何您都想存储所有这些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多