我想访问/迭代 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()
),内部循环测试相应的键是否存在不止一次。
有没有更有效或更优雅的方法来做到这一点?
注意:我知道使用 aunordered_map
而不是unordered_multimap
我不会有这个问题,但由于应用程序的要求,我必须能够存储多个<SIG>
指向不同标识符的键<ID>
。此外,anunordered_map<SIG, vector<ID> >
对我来说不是一个好的选择,因为它使用了大约 150% 的内存,因为我有许多唯一的键,并且vector<ID>
为每个项目增加了相当多的开销。