有没有办法将char
与char
列表中的每个元素进行比较?
char ch;
if(ch == 'a' || ch == 'b' || ch == 'c')
有什么方法可以做到
if(ch is one of {a, b, c})
答案 0 :(得分:8)
为什么你会写lambda或使用一次性字符串对象:
if (strchr("abc", ch))
答案 1 :(得分: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 :(得分:3)
您可以使用std::find
。假设chars
是您的角色数组,您需要找到ch
。
if(std::find(std::begin(chars), std::end(chars), ch) != std::end(chars))
答案 3 :(得分:3)
一种方法是搜索字符串,如下所示:
string abc("abc");
if (abc.find(ch) != string::npos) {
...
}
答案 4 :(得分:3)
(这个答案真的只适用于你不想使用C ++ std lib构造的情况。)
在您的具体情况下,您应该可以:
if(ch >= 'a' && ch <= 'c')
在这种情况下我也采用了直通式开关:
switch(ch)
{
case 'a':
case 'b':
case 'c':
case 'e':
...
break;
}
有些人不喜欢直通开关/ case语句,但我认为它比一大块布尔逻辑更不容易出错,并且比为此目的使用数据结构表现更好。编译器非常适合处理switch语句。
答案 5 :(得分: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
就是其中之一)也应该有用。
希望它有所帮助。祝你好运!
答案 6 :(得分:0)
正如另一个选项,创建一个带有字符的set
,并检查它是否包含在那里;
std::set<char> mySet = {'a','b','c'}; // C++11 initializer list
if(mySet.find('d') != mySet.end()) {
...
}