1

我正在学习 c++ 并想知道执行以下操作的最佳或最惯用的方法是什么。我有一个已知接受字符串的列表,这些字符串对于程序来说是不变的。我想知道提供给函数的字符串是否在我接受的字符串列表中。我想出了:

bool match(const char* foo, const char* bar) {
    return strcmp(foo, bar) == 0;
}

bool thingIsValid(const char* thing) {
    return match("foo", thing) || match("bar", thing) || match("baz", thing);
}

...
thingIsValid(someArg.c_str());
...

这种方法对我来说似乎更像是 C 习语。在其他语言中,我可能只会有一个列表并在该列表上执行 .contains(thing) 。人们通常如何在 C++ 中做到这一点?

4

3 回答 3

6

现在最好的方法可能是使用无序集:

std::unordered_set<std::string> ValidValues {"one", "two", "three"};

if( ValidValues.find( testString ) == ValidValues.end() ) {
    // String is not valid...
}

这里唯一真正的缺点是您不能简单地在可执行映像中布置有效字符串。(设置集合需要初始化代码和堆分配。)但这对于绝大多数应用程序来说并不重要。

于 2013-01-11T18:42:18.197 回答
2

一种可能的方法:

bool thingIsValid(const std::string &thing) {
  static const std::vector<std::string> validValues {"foo", "bar", "baz"};
  return std::find(validValues.begin(), validValues.end(), thing) != validValues.end();
}

上面的代码使用 C++11 列表初始化来创建vector. 如果您没有 C++11,则必须使用push_back().

于 2013-01-11T18:36:15.423 回答
1

std::string::find就是你要找的。 参考

于 2013-01-11T18:33:38.183 回答