所以,伙计们,我std::unordered multimap
只是为了好玩而玩。我想存储(在此示例中)unsigned short
s,具有自定义哈希和相等。
有趣的部分是什么?如果两个项目都是偶数或奇数,则它们相等。
因此,据我了解,std::unordered_map
即使实际值不同,我也不能使用:自定义谓词另有说明。(如果我错了,请纠正我,显然!)
回顾一下:我存储了不同的整数,因此存储了不同的 hashes,但它们在谓词下的值可能是相同的。
#include <iostream>
#include <unordered_map>
class tt
{
public:
tt(const unsigned short v = 0) : i(v) { };
unsigned short i;
};
class tt_hash
{
public:
size_t operator()(const tt &v) const
{
auto f = std::hash<unsigned short>();
return f(v.i);
};
};
class tt_equal
{
public:
bool operator()(const tt &u, const tt &v) const
{
return (u.i % 2) == (v.i % 2);
};
};
typedef std::unordered_multimap<tt, bool, tt_hash, tt_equal> mymap;
// Print all values that match a criteria
void f(const mymap &m, unsigned short c)
{
auto range = m.equal_range(c);
auto target = range.first;
if (target == m.end())
{
std::cout << "not found : " << (int) c << std::endl;
}
else
{
for (auto i = target; i != range.second; i++)
std::cout << "there is : " << (int) i->first.i << " : " << i->second << std::endl;
}
}
int main(int argc, const char * argv[])
{
mymap m;
m.emplace(std::make_pair(tt(3), false));
m.emplace(std::make_pair(tt(10), true));
m.emplace(std::make_pair(tt(4), true));
m.emplace(std::make_pair(tt(23), false));
std::cout << "size " << m.size() << std::endl;
std::cout << "buck " << m.bucket_count() << std::endl;
int c = 0;
for (auto i = m.begin(); i != m.end(); i++)
std::cout << "# " << c++ << " : " << (int) i->first.i << " : " << i->second << std::endl;
f(m, 3);
return 0;
}
所以,当我执行上面的代码时,我找到了正确的值,3、10、4、23(当然不是这个顺序)。
出乎意料的是,当打印所有匹配 3调用的值时f()
,我得到了两个答案,3 和 23;但是当我要求 1000 时,我希望打印所有偶数,但我错了:
size 4
buck 5
# 0 : 4 : 1
# 1 : 10 : 1
# 2 : 3 : 0
# 3 : 23 : 0
there is : 10 : 1
我在这里错过了什么吗?(答案显然是肯定的)