【发布时间】:2017-09-04 08:32:11
【问题描述】:
我的问题不是关于使用不区分大小写的 std::unordered_set,而是它是如何工作的?
#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 用于当集合试图插入一个键并且存在哈希冲突时,它必须决定键是相同还是不同。
根据代码,它无论如何都可以工作,所以我的一些假设是不正确的。如果有人告诉我我的哪些假设是错误的,那将会很有帮助。
谢谢。
编辑:我对这种不区分大小写的unordered_set 的期望是应该只插入 1 个密钥,并且我观察到了这种情况,即只显示了 AWESOME。因此,对于我的情况,我认为它有效,但根据 kennytm 的回答,我很幸运能够将所有钥匙放在同一个桶中。我确实使用 MSVC 来编译代码。
【问题讨论】:
-
你是如何证明“它有效”的?
-
在我的机器上打印
AWESOmE和AWESOME,所以它不起作用。 -
case insensitive work是什么意思?请说明您的预期和观察到的情况。
标签: c++ c++11 unordered-set