静态存储的字符串集

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