如何访问/迭代unordered_multimap中的所有非唯一键
How to access/iterate over all non-unique keys in an unordered_multimap?
我想访问/迭代unordered_multimap中的所有非唯一键。哈希表基本上是从签名<SIG>
到标识符<ID>
的映射,在实践中确实出现了不止一次。我想在哈希表中找到那些出现过一次的条目。
目前我使用这种方法:
// map <SIG> -> <ID>
typedef unordered_multimap<int, int> HashTable;
HashTable& ht = ...;
for(HashTable::iterator it = ht.begin(); it != ht.end(); ++it)
{
size_t n=0;
std::pair<HashTable::iterator, HashTable::iterator> itpair = ht.equal_range(it->first);
for ( ; itpair.first != itpair.second; ++itpair.first) {
++n;
}
if( n > 1 ){ // access those items again as the previous iterators are not valid anymore
std::pair<HashTable::iterator, HashTable::iterator> itpair = ht.equal_range(it->first);
for ( ; itpair.first != itpair.second; ++itpair.first) {
// do something with those items
}
}
}
这肯定是不高效的,因为外部循环遍历哈希表的所有元素(通过ht.begin()
),而内部循环测试相应的键是否不止一次出现。
是否有更有效或更优雅的方法来做到这一点?
注意:我知道用unordered_map
代替unordered_multimap
我不会有这个问题,但由于应用程序的要求,我必须能够存储多个键<SIG>
指向不同的标识符<ID>
。此外,unordered_map<SIG, vector<ID> >
对我来说不是一个好的选择,因为它使用了大约150%的内存,因为我有许多唯一的键,vector<ID>
为每个项增加了相当多的开销。
使用std::unordered_multimap::count()
来确定具有特定键的元素的数量。这为您节省了第一个内部循环。
你不能阻止整个HashTable
的迭代。为此,HashTable
必须维护第二个索引,将基数映射到键。这将引入大量的运行时和存储开销,并且仅在少数情况下有用。
您可以使用std::for_each()
隐藏外循环,但我认为这并不值得。
我认为你应该把你的数据模型改成:
std::map<int, std::vector<int> > ht;
然后您可以很容易地遍历map,并使用size()
但是在这种情况下,建立一个数据结构并以线性模式读取它就有点复杂了
相关文章:
- 用 C++20 的给定键读取/写入 std::multimap 的所有值?
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 如何从一组具有从左到右优先级的整数值创建有序整数键?
- 如何使用 std::multimap 将整数键映射到两个用作多维数组坐标的整数值(对于井字)?
- "std::multimap"是否保证每个键的实际值在相等范围内?
- 特定键在 std::multimap 中出现的次数
- 如何使用推力将相同键从一个数组复制到另一个数组的值
- 使用 GLFW 一次处理多个键输入
- std :: multimap :: emplace覆盖旧键
- C++ 如何在具有 O(n) 遍历的不同映射容器中区分具有带值的重复键和具有值的唯一键的 Multimap
- 如何创建Google+Plus一键,同时已经使用GooglePlay游戏服务SDK for C++实现了排行榜
- 有没有一种方法可以模拟从鼠标右键菜单发送到控制台的调用
- C++:映射,键的上一项
- 如何获取 std::multimap 给定键"previous"项的迭代器(或值)?
- 在键上使用 map.find() 和 count(),这是一种类对象类型
- 如何检测相同的键盘键只按一次
- 只有当我在 c++ 中按 Enter 键(线程)时,代码如何进入下一步
- 一键构建所有配置和平台
- 使用批处理文件使用 Cmake & Msbuild (vs2010) 一键构建我的项目
- QML - 一键锁定/解锁屏幕方向(安卓和最终的 ios)