我的问题不在于使用不区分大小写的std :: unordered_set,而是它如何工作?为什么std :: unordered_set的std :: hash函数不区分大小写?
#include "stdafx.h"
#include <string>
#include <iostream>
#include <unordered_set>
#include "boost/algorithm/string.hpp"
struct case_insensitive_comparer
{
bool operator() (const std::string& x, const std::string& y) const
{
return boost::iequals(x, y);
}
};
using case_insensitive_set = std::unordered_set<std::string, std::hash<std::string>, case_insensitive_comparer>;
std::vector<std::string> permute_case(const std::string& s)
{
std::vector<std::string> strs;
// Iterate through all bitmasks, 1 for uppercase, 0 for lowercase
int msb = 1 << (s.length() - 1);
int upper = 1 << s.length();
std::locale loc;
for (int i = 0; i < upper; i++)
{
int bit = msb;
std::string current = "";
for (size_t j = 0; j < s.length(); j++, bit >>= 1)
current += (bit & i) ? std::toupper(s[j], loc) : std::tolower(s[j], loc);
strs.push_back(current);
}
return strs;
}
int main()
{
std::vector<std::string> strs = permute_case("awesome");
case_insensitive_set set(strs.begin(), strs.end());
// Check the hash
for (auto& s : strs)
std::cout << s << " :" << std::hash<std::string>()(s) << "\n";
// Check the element
for (auto& s : set)
std::cout << s << "\n";
return 0;
}
所以我用std::unordered_set
和字符串大小写不敏感的比较器的std::hash<std::string>
作为哈希函数。我对散列集的基本理解(我假设unordered_set就像一个散列集)是它计算密钥的散列值,如果它还不存在,则将其放入集合中。并且比较器Pred是当集合试图插入一个密钥并且存在散列冲突时,它必须确定这些密钥是相同还是不同。
基于代码,它的工作原理不管,所以我的一些假设是不正确的。如果有人告诉我我的哪些假设是错误的,那将会很有帮助。
谢谢。
编辑:我对这种不区分大小写的期望是,应该只有1个关键插入,并且我观察到的情况,即只有AWESOME显示。所以对于我的情况,我认为它的工作,但真正的肯尼特答案,我只是幸运地把所有的钥匙都放在同一个桶里。我确实使用MSVC编译代码。
你是如何证明“它有效”的? – juanchopanza
在我的机器上打印'AWESOmE'和'AWESOME',所以它*不工作。 – kennytm
'你是什么意思'不区分大小写的工作'?请解释你的期望和你观察到的。 – 4386427