如何对std :: unordered_set中的元素进行排序?

时间:2018-02-15 13:45:26

标签: c++ stl hashtable unordered-map unordered-set

填写STL后 unordered_set< int> 我试图根据特定的顺序对每个桶中的元素进行排序(尽管容器名称相互矛盾)。事实上,没有对容器中的元素进行任何更改,据我所知,它会阻止标准的 std :: sort 工作。例如,下一个代码不会编译:

#include <unordered_set>
int main()
{
    std::unordered_set<int> set_;

    set_.max_load_factor(100);

    set_.insert(6);
    set_.insert(3);
    set_.insert(8);
    set_.insert(17);
    set_.insert(1);
    set_.insert(2);
    set_.insert(9);

    for (int i = 0; i < set_.bucket_count(); ++i)
    {
        std::sort(set_.begin(i), set_.end(i));
    }
}

那么,是否存在针对该障碍的解决方法?是否可以获得临时排序列表,然后将其分配给初始存储桶?

2 个答案:

答案 0 :(得分:3)

没有API可以执行您正在执行的操作,因为容器公开接口而不是实现是违反STL设计原则的。无法保证&#34;对每个桶进行排序&#34;一般来说都是有意义的(即使在你的特定实现中是可能的)。

如果您确定需要对每个桶进行排序&#34;在哈希表中,您需要实现自己的哈希表。鉴于过多的开源实现,这不会很难。如果通常使用链表实现存储桶,则可以使用平衡二叉树。

答案 1 :(得分:1)

&#34;在我的真实代码中...自定义哈希函数...按照我需要的方式放置元素&#34; - 你确定吗? - 您的自定义哈希函数不直接选择存储桶 - unordered_set将其用作 输入到其存储桶选择中,通常执行类似% bucket_count()的操作,或者可能& (bucket_count() - 1)作为优化bucket_count()始终是2的幂。并且您无法控制存储桶的数量 - 调用reserve(n)可以将n向上舍入到例如附近(不一定是下一个)素数或两个力量。所有实现都已定义也就是说,你可以在你的哈希函数中使用bucket_count()来真正控制你的密钥如何被分组到桶中,或者只产生小于你n的哈希值。已提供给reserve(),但在您执行此操作时,您可能还需要将索引管理为std::vector个键。无论如何,足够的 - 让我们相信你确实按照你想要的方式控制了哈希 - 如果你想要一个排序的元素列表,你可以简单地使用:

std::unordered_map<KeyOnly, AnotherContainer<KeyAndValue>> x;

其中AnotherContainer是任何固有排序的容器(例如std::set),或者可以按照您在问题中尝试的方式在代码中明确排序(例如{{1} },std::list)。