问题标签 [unordered-set]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
420 浏览

c++ - unordered_set 中的哈希函数

我正在使用 unordered_set 来实现哈希表。我不知道如何使用查找功能。运行此代码时,我不断收到段错误。我知道它是因为 find() 没有找到一个元素,但它应该。我的问题是如何正确使用 find 与我提供的自定义哈希函数?

数据只是一个

我的哈希函数看起来像这样

0 投票
1 回答
528 浏览

c++ - 对的无序多映射

我正在努力成对有效地存储信息:

例如,我有两个表示 (x,y) 坐标的结构,我希望计算并存储它们之间的距离。目前我将所有值存储在一个

unordered_map<pair<Struct1*,Struct2*,double>

我的问题是,在搜索时,我希望结果与我不必存储两次信息<Struct1*,Struct2*>的方式相同。<Struct2*,Struct1*>我曾考虑过使用多重映射,但我认为这将与有关如何执行此操作的任何建议std::hash<pair<pointer1,pointer2>>的哈希值相同?pair<pointer2,pointer1>

编辑:

我考虑过做一个客户哈希,它只是使用 std::hash 添加指针的两个哈希值,例如:

size_t operator() (const pair<Location*,Location*> &key) { hash<Location*> hash1; return (hash1(key.first) + hash1(key.second)); }

这在我调用 find(struct1,struct2) 时有效,但在我调用 find(struct2,struct1) 时无效

0 投票
2 回答
352 浏览

c++ - C++中无序关联容器的哈希函数

在 C++ 中,对于每个无序关联容器(如unordered_mapunordered_setunordered_multimap),我们需要定义一个哈希函数。正如维基百科所指出的,

struct hash_X是 的自定义散列函数struct X。但是这个函数有什么作用呢?为什么我们需要哈希函数?可以有任何其他类型的自定义散列函数吗?如果是这样,我们如何比较任何两个这样的功能之间的效率。

0 投票
1 回答
2992 浏览

c++ - 定义 std::hash

我需要创建一个模板类,它可以保存指向类型元素的指针T,然后对它们执行函数。函数会来自不同的地方,所以我需要一个容器来存储它们,这样我以后可以调用它们。我决定使用std::unordered_set,因为它提供了速度并限制了重复,因为它被实现为哈希表。我编写了一个完整的类,但由于没有为我定义的散列函数std::function接受类型指针T并返回,因此无法编译void。为我使用的每种类型指定它struct hash<std::function<void(MyCustomType*)>>(并且也重载()运算符)很容易,但是我如何实际散列函数?

这是我的课堂上的相关成员和方法的淡化摘录:

我并不完全一定要使用std::unordered_set,但它似乎提供了使这部分(以及我的其余代码)正常工作所需的一切。

我在想这个错误的方式吗?哈希 a 是完全不可能的std::function吗?

0 投票
1 回答
252 浏览

sorting - 在 unordered_sets 上排序

我有一个每帧创建的项目列表,需要对其进行排序。每个 Item 的第一个排序依据的成员变量是一个unordered_set.

我已将其移至系统中各处的有序集,以便我可以在项目列表中对其进行排序。但是我在另一个代码中遇到了性能问题。

请记住,每个项目都将被销毁并在每帧的基础上重新创建,我能做些什么来将它们保存在unordered_sets 中并对其进行排序?

0 投票
2 回答
1797 浏览

c++ - 使用 shared_ptr进入 unordered_set

我试图通过将字符串放入 anunordered_set<string>然后在shared_ptr<string>'s. 很难知道何时删除了对集合中字符串的所有引用,所以我希望 shared_ptr 可以帮助我。这是未经测试的代码,说明了我希望如何编写它:

在上面,字符串“foo”只有一个实例应该在 string_pool 中;a 和 b 都应该指向它;并且在 a 和 b 都被破坏的时候,应该从 string_pool 中删除“foo”。

emplace() 上的文档建议,但没有向我说明,该指针a可以在由指针分配引起的重新散列中幸存下来b。它似乎也保证了“foo”的第二个位置不会导致任何重新分配,因为它被认为已经存在于集合中。

我在正确的轨道上吗?我需要防止 string_pool 无休止地增长,但是没有一点可以简单地 clear() 它,也没有任何明确的字符串“所有者”。

更新 1

这个问题的历史:这是一个“交通警察”应用程序,它从服务器读取数据,将数据打包到其他服务器,接收他们的答案,将这些数据打包给其他人,接收,最后组装并返回一个摘要答案。它包括一个应用程序协议栈,用于接收 TCP 消息,将它们解析为字符串标量值,然后应用程序将其组装成其他 TCP 消息,发送、接收等。我最初使用strings、vectors<string>s 和字符串引用编写它,并且valgrind报告“大量”字符串构造函数(甚至使用-O3编译),以及集中在与字符串相关的库例程中的高 CPU 使用率。我被要求研究减少字符串复制的方法,并设计了一个“memref”类(char*和指向输入缓冲区的长度)可以复制来代替字符串本身。然后出现了需要重用输入缓冲区的情况,而其中的 memrefs 仍然需要有效,因此我付费将每个缓冲区子字符串复制到一个保留区域 (an unordered_set<string>),并将 memref 指向那里。然后我发现在这个过程中找到一个可以一次性清除收容区的地方是困难和不方便的(以防止其无限制地增长),我开始尝试重新设计收容区,以便当所有 memrefs 到一个实习字符串不见了,字符串将从池中删除。因此shared_ptr。

正如我在对@Peter R 的评论中提到的那样,我对移动语义、容器和引用甚至比现在更不舒服,而且很可能我没有编写简单的、基于字符串的解决方案来使用所有 C+ +11 可以提供。到现在为止,我似乎一直在绕一个大圈子旅行。

0 投票
1 回答
853 浏览

c++ - C ++中无序集的大小是否有限制

我正在解析一个带有单词和标签的文本文件(看起来像单词/标签)。我正在尝试查找文件中唯一标签的数量,并使用 C++ 中的无序集来插入标签。然而,我似乎随机得到这个异常:“EXC_I386_GPFLT”在插入(在插入次数不确定之后)到我的无序集中。我不认为我的内存不足,因为 Xcode 说我只使用了 ~300 - 400 KB。

这是我的主要功能:

这是我的 ParseTrain.cpp:

这是我的 ParseTrain.h:

最后,这是我试图解析并获取标签的文本文件的一小部分:

我真的无法弄清楚为什么在插入时会抛出异常。我唯一能想到的是,无序集的大小可能有限制,但考虑到我使用的内存如此之少,这似乎很奇怪。任何帮助将不胜感激。

0 投票
1 回答
84 浏览

c++ - 如何检查 unordered_set 是否重叠?

我有两个 unordered_sets,需要检查第一个的所有元素是否也是第二个的元素。

有没有一种快速的方法可以做到这一点,或者我应该使用另一个容器?

0 投票
2 回答
606 浏览

c++ - std::unordered_multiset::find 函数是否返回具有相同哈希值的两个值之间的第一个插入元素

假设我们有std::unordered_multiset两个映射相同哈希值的值,c++ 标准是否有任何保证 find 将返回第一个插入的元素?

0 投票
3 回答
327 浏览

c++ - 无序集,是否值得在插入之前调用 find?

将元素插入 std::unorder_set 时,是否值得在 std::unordered_set::insert 之前调用 std::unordered_set::find?根据我的理解,我应该总是调用 insert 因为它返回一个 std::pair ,其中包含一个告诉插入是否成功的布尔值。