2013-10-23 17 views
2

有没有办法将charchar列表中的每个元素进行比较?将一个char与C++中的列表中的字符进行比较

char ch; 
if(ch == 'a' || ch == 'b' || ch == 'c') 

有一些方法只是做

if(ch is one of {a, b, c}) 
+1

使用'的std :: find'或尽量保持一个字符串,而不是字符的列表 – andre

+3

查找和strchr'()',如果你要处理的C风格的字符串。 –

+2

'strchr'确实比任何答案中使用的“现代C++”方法都简单得多。 –

回答

3

你可以使用std::find。假设chars是你的角色数组,你需要找到ch

if(std::find(std::begin(chars), std::end(chars), ch) != std::end(chars)) 
3

一种方式做到这一点正在搜索的字符串,像这样:

string abc("abc"); 
if (abc.find(ch) != string::npos) { 
    ... 
} 
+0

是的,成员'find'比''的通用版本更容易使用(和阅读)。可以与临时的''''对象一起使用,甚至可以作为'string(“abc”)。find(ch)'或用户定义的文字''abc“str.find(ch)'。但与“”方式相比,仍然非常冗长。 –

+0

@BenVoigt你说得对 - 我主要是为了“意识形态的原因”而使用'std :: string',尽管C库的函数在C++中也是非常好的。 – dasblinkenlight

6

用途:std::any_of

用C++ 11:

std::string str="abc"; 

if(std::any_of(str.cbegin(), str.cend(), 
    [ch](const char& x){return x==ch; })) 
{ 

} 

或者使用函子:

struct comp 
{ 
    comp(char x) :ch(x){} 
    bool operator()(const char& x) const 
    { 
     return x == ch; 
    } 
    char ch; 

}; 

然后,

if(std::any_of(str.cbegin(), str.cend(),comp(ch))) 
{ 

} 

编辑std::any_of可能不够有效,只是为了成全C++的<algorithm>一个可以尝试了这一点了。

+2

+1,我总是忘记它需要一个谓词,而不是一个值(这是一个耻辱,IMO)。 – jrok

+1

我更喜欢这个解决方案,而不是那些利用'std :: find'的解决方案,因为它更清楚地传达了你正在尝试做的事情。 – Escualo

+0

该算法在其实现中使用循环吗? – Ares

3

(这个答案真的只适用,如果你不希望使用C++标准库构建)

在特定情况下,你应该能够做到:

if(ch >= 'a' && ch <= 'c') 

我也有这种情况下所使用的下通开关:

switch(ch) 
{ 
    case 'a': 
    case 'b': 
    case 'c': 
    case 'e': 
     ... 
     break; 
} 

有些人不喜欢下降通道开关/ case语句,但我认为不是一个巨大的一块布尔逻辑容易出现的错误更少,并且将PERFO比为此目的使用数据结构更好。编译器在处理switch语句方面非常好。

+0

这就是我即将发布的内容:) –

+1

这取决于正在使用的字符集 - 字符不需要是连续的(例如不像十进制数字)。 –

+0

@Paul这将适用于ASCII和UTF8。 UTF16将是一个广泛的字符。 –

1

如果你可以使用可变参数模板参数,这是在C++ 11引入,那么你可以做something like this

template <typename Key, typename Value> 
inline bool in(const Key& key, const Value& value) { 
    return key == value; 
} 

template <typename Key, typename Value0, typename ...ValueN> 
inline bool in(const Key& key, const Value0& value, ValueN &&...args) { 
    return (key == value ? true : in(key, std::forward<ValueN>(args)...)); 
} 

我使用它的字符串是这样的:

if (in(some_string, "base", "os", "io", "coroutine", "debug")) ... 

但其他支持比较的类型(char就是其中之一)也应该可以工作。

希望它有帮助。祝你好运!

8

你为什么会写lambda表达式或使用一次性字符串对象时,你可以:

if (strchr("abc", ch)) 
+0

如果'“abc”'先被绑定到一个字符串,该怎么办? 'std :: string s =“abc”'。在这里使用'strchr'会不正确吗? – Ares

+0

@Dochevsky:'strchr(some_string.c_str(),ch)'可以工作,但除非你有其他原因的字符串对象,否则这太浪费了。构建一个'std :: string'对象相对比较昂贵。 –

0

正如另一种选择,创建角色A set,并检查其是否包含有;

std::set<char> mySet = {'a','b','c'}; // C++11 initializer list 

if(mySet.find('d') != mySet.end()) { 
    ... 
} 
相关问题