填写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));
}
}
那么,是否存在针对该障碍的解决方法?是否可以获得临时排序列表,然后将其分配给初始存储桶?
答案 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
)。