在C ++中将char与char中的chars进行比较

时间:2013-10-23 17:28:00

标签: c++

有没有办法将charchar列表中的每个元素进行比较?

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

有什么方法可以做到

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

7 个答案:

答案 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()) {
    ...
}