我正在学习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 ++中这样做?
答案 0 :(得分:6)
这些天最好的方法可能是使用无序集:
std::unordered_set<std::string> ValidValues {"one", "two", "three"};
if( ValidValues.find( testString ) == ValidValues.end() ) {
// String is not valid...
}
这里唯一真正的缺点是你不能简单地在可执行映像中布置有效的字符串。 (设置集需要初始化代码和堆分配。)但这对绝大多数应用程序来说并不重要。
答案 1 :(得分: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 list-initialisation来创建vector
。如果您没有C ++ 11,则必须使用push_back()
构建向量。
答案 2 :(得分:1)
std::string::find
正是您正在寻找的。
Reference