unordered_map<std::string_view, property_enum>
(для IO), и нестатический "быстрый" unordered_map<property_enum, V>
(для всего остального). В интернете можно найти 9001 решение для безболезненной конвертации enum в строку и обратно. хешируемое значение в работе требуется чуть чаще чем никогда
std::hash
. Так что посчитать хеш на этапе компиляции. вроде, не выйдет. Попытался протестировать на godbolt, но ни один компилятор ещё не поддерживает constexpr std::string
.friend
использую, чтобы уменьшить API surface, т.е. чтобы вместо двух способов вытащить хеш был один - std::hash<hashed<T>>()(h)
. Если этот хеш часто нужно вытаскивать напрямую из hashed, можно и добавить геттер. Поправил, чтобы friend
-ился только свой, "родной" std::hash
.std::string
на std::string_view
, и всё почти заработало, но лол, std::hash<std::string_view>
тоже не constexpr
. Вот не хотят они, чтобы наша задача решилась. Надо писать свою обёртку над std::string_view
(my_string_view
) и определять для неё constexpr std::hash
. int count(std::string_view src, std::string_view pat) {
const auto good_chars = std::unordered_set(pat.begin(), pat.end());
return std::accumulate(src.begin(), src.end(), 0, [&](char c) {
return good_chars.find(c) != good_chars.end();
});
}
std::vector<size_t>
char* input = ...;
char* stringToRemove = ...;
std::string s(input);
removeSubstrs(s, stringToRemove);
const char* output = s.c_str();
useProcessedString(output);