静态存储的字符串集



我的程序中有一些字符串比较逻辑,例如:

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的现代实现)。

相关内容

最新更新