2013-01-11 68 views
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(事物)。人们通常在C++中如何做到这一点?

+1

使用'std :: string'和'std :: find'。什么是指针? –

回答

6

也许这些天的最佳方法是使用一个无序集:

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

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

这里唯一真正的缺点是,你不能简单地铺陈在你的可执行映像的有效字符串。 (设置这个集合需要初始化代码和堆分配。)但是这对绝大多数应用程序来说应该没有关系。

+0

如果您还没有使用C++ 11,只需使用std :: set 。 – phonetagger

+0

使用count而不是find可读性更强一些:'if(ValidValues.count(testString)){/ * valid * /} else {/ * not valid * /}'。你可能也想看看正则表达式。 – lego

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()来构建该向量。

相关问题