4

有没有办法将 a与 schar列表中的每个元素进行比较char

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

有什么办法可以做

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

8 回答 8

11

当你能做到的时候,你为什么要编写 lambdas 或使用一次性字符串对象:

if (strchr("abc", ch))
于 2013-10-23T17:35:27.550 回答
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>也可以尝试一下。

于 2013-10-23T17:31:17.723 回答
4

你可以使用std::find. 假设chars是你的字符数组,你需要找到ch.

if(std::find(std::begin(chars), std::end(chars), ch) != std::end(chars))
于 2013-10-23T17:30:41.400 回答
4

一种方法是搜索字符串,如下所示:

string abc("abc");
if (abc.find(ch) != string::npos) {
    ...
}
于 2013-10-23T17:30:41.770 回答
4

(这个答案真的只适用于你不想使用 C++ 标准库结构的情况。)

在您的具体情况下,您应该能够:

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

对于这种情况,我还使用了直通开关:

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

有些人不喜欢通过 switch/case 语句,但我认为它比大量布尔逻辑更不容易出错,并且比为此目的使用数据结构更好。编译器非常擅长处理 switch 语句。

于 2013-10-23T17:31:51.063 回答
1

如果您可以使用 C++11 中引入的可变参数模板参数,那么您可以执行以下操作:

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是其中之一)也应该可以工作。

希望能帮助到你。祝你好运!

于 2013-10-23T17:35:16.590 回答
0

作为另一种选择,set使用字符创建一个,并检查它是否包含在那里;

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

if(mySet.find('d') != mySet.end()) {
    ...
}
于 2013-10-23T17:46:17.013 回答
0

我有点惊讶没有人建议 find_first_of。

    char c('e');

// we can check if c is undesirable
    const std::string unwanted("abc");
    bool undesirable = (unwanted.find_first_of(c) != std::string::npos);
 
// OR we can check if c is desirable
    const std::string wanted("def");
    bool desirable = (wanted.find_first_of(c) != std::string::npos); //..or check if it's desirable.

我使用它(也许我不应该?伙计们?)来忽略字符串迭代器中不需要的字符......

/** in and out are string iterators.
  * skip over any undesirable characters by matching 
  * against desirable and looking for npos.
 **/
const std::string ok("!+-./0123456789:^ABFIORmn");
while (ok.find_first_of(*in) == string::npos && in < out) {
    in++;
}

这样做的一个很好的好处是,通过将更频繁的字符放在字符串的前面,可以节省一点时间。

于 2021-08-26T12:14:10.073 回答