내가 가진 질문은 대소 문자를 구분하지 않는 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는 집합이 키를 삽입하려고 할 때 해시 충돌이있을 때 키가 같거나 다른지를 결정해야합니다.
코드를 기반으로하면 관계없이 작동하므로 내 가정 일부가 올바르지 않습니다. 누군가 내 가정이 잘못되었다고 말하면 도움이 될 것입니다.
감사합니다.
편집 :이 경우 대소 문자를 구분하지 않아도된다고 생각합니다. unordered_set
은 1 개의 키만 삽입하면됩니다. 관찰 한 경우입니다. 즉, AWESOME 만 표시됩니다. 그래서 제 경우에는 작동하는 것으로 생각했지만 kennym의 대답으로 모든 키가 같은 버켓에있게되어 운이 좋았습니다. 실제로 MSVC를 사용하여 코드를 컴파일합니다.
"작동 여부"는 어떻게 증명 했습니까? – juanchopanza
내 컴퓨터에서'AWESOmE'와'AWESOME'을 출력하므로 * 작동하지 않습니다. – kennytm
'대소 문자를 구별하지 않는 작업'이란 무엇입니까? 예상 한 것과 관찰 한 것을 설명하십시오. – 4386427