静态存储的字符串集
Statically stored set of strings
我的程序中有一些字符串比较逻辑,例如:
std::unordered_set<std::string> relational_operators{
"==",
"!=",
">",
"<",
">=",
"<="
};
bool is_relational(std::string token) {
relational_operators.contains(token);
}
if (is_relational(token)) {
// ...do stuff
}
set 的所有值在编译时都是已知的,但将根据用户输入进行检查。
这些字符串通常如何存储在 C++ 中?我不知道像这样存储一个集合是否是个好主意,可能不是因为它可能会在分配发生时抛出错误(IDE 警告)。
例如,如果我有另一组字符串(支持的运算符):
std::unordered_set<std::string> supported_operators {
// ...
};
随着时间的推移,将添加对新运算符的支持。所以我只想向集合中添加一个新的运算符。所以基本上我想避免这样的情况:
bool is_supported_op(std::string token) {
return token == "<" || token == ">" || token == "!="; // ... many more ||
}
鉴于您显然不打算在 运行 时修改字符串集,我可能会使用 std::array<std::string, N>
来保存它们,然后使用 std::binary_search
进行搜索。
从理论的角度来看,无论哪种方式,您都会得到 O(log N) 次查找——但实际上,该数组可能会提供足够好的缓存局部性,从而大大提高性能(尤其是如果您使用的是实现短字符串优化的 std::string
的现代实现)。
我的程序中有一些字符串比较逻辑,例如:
std::unordered_set<std::string> relational_operators{
"==",
"!=",
">",
"<",
">=",
"<="
};
bool is_relational(std::string token) {
relational_operators.contains(token);
}
if (is_relational(token)) {
// ...do stuff
}
set 的所有值在编译时都是已知的,但将根据用户输入进行检查。 这些字符串通常如何存储在 C++ 中?我不知道像这样存储一个集合是否是个好主意,可能不是因为它可能会在分配发生时抛出错误(IDE 警告)。
例如,如果我有另一组字符串(支持的运算符):
std::unordered_set<std::string> supported_operators {
// ...
};
随着时间的推移,将添加对新运算符的支持。所以我只想向集合中添加一个新的运算符。所以基本上我想避免这样的情况:
bool is_supported_op(std::string token) {
return token == "<" || token == ">" || token == "!="; // ... many more ||
}
鉴于您显然不打算在 运行 时修改字符串集,我可能会使用 std::array<std::string, N>
来保存它们,然后使用 std::binary_search
进行搜索。
从理论的角度来看,无论哪种方式,您都会得到 O(log N) 次查找——但实际上,该数组可能会提供足够好的缓存局部性,从而大大提高性能(尤其是如果您使用的是实现短字符串优化的 std::string
的现代实现)。