Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将字符与C+中列表中的字符进行比较+;_C++ - Fatal编程技术网

C++ 将字符与C+中列表中的字符进行比较+;

C++ 将字符与C+中列表中的字符进行比较+;,c++,C++,是否有方法将char与chars列表中的每个元素进行比较 char ch; if(ch == 'a' || ch == 'b' || ch == 'c') 有什么方法可以做到这一点吗 if(ch is one of {a, b, c}) 您可以使用std::find。假设chars是您的字符数组,您需要查找ch if(std::find(std::begin(chars), std::end(chars), ch) != std::end(chars)) 一种方法是搜索字符串,如下所示:

是否有方法将
char
char
s列表中的每个元素进行比较

char ch;
if(ch == 'a' || ch == 'b' || ch == 'c')
有什么方法可以做到这一点吗

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

您可以使用
std::find
。假设
chars
是您的字符数组,您需要查找
ch

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

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

string abc("abc");
if (abc.find(ch) != string::npos) {
    ...
}
if (in(some_string, "base", "os", "io", "coroutine", "debug")) ...
使用:

使用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) ))
{

}
<> > >编辑< /St>: STD::YANYO<可能不够有效,仅为了C++的代码> <代码>,也可以尝试。

< P>(这个答案只适用于如果你不想使用C++ STD LIB构造)。 在您的具体情况下,您应该能够做到:

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

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

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

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


希望能有帮助。祝你好运

如果您可以:

if (strchr("abc", ch))

作为另一个选项,使用字符创建一个
,并检查它是否包含在其中

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

if(mySet.find('d') != mySet.end()) {
    ...
}
std::set mySet={'a','b','c'};//C++11初始值设定项列表
if(mySet.find('d')!=mySet.end()){
...
}

如果你处理的是C风格的字符串,那么使用
std::find
或者尝试维护一个字符串而不是字符列表look up
strchr()
strchr
确实是一个比答案使用的任何“现代C++”方法都简单得多的解决方案。+1,我总是忘记它需要一个谓词,而不是一个值(这是一个遗憾,IMO)。与使用
std::find
的解决方案相比,我更喜欢这种解决方案,因为它能更清楚地传达您正在尝试做的事情。这种算法在其实现中使用循环吗?@Dochevsky:是的,当然。优化器可能能够或可能无法自动解开它(可能不会)@Dochevsky:就效率而言,最好是一个查找表,然后使用最小的连续范围集进行比较(见Doug的答案),然后是问题中的代码和在运行时应该等价的Vlad,然后是我的答案中的
strchr
,然后是
std::find
std::字符数组中的任何
,最慢的是一次性字符串对象中的迭代。这就是我要发布的:)这取决于所使用的字符集,虽然-这些字符不需要是连续的(例如,与十进制数字不同)。@Paul这适用于ASCII和UTF8。UTF16将是一个宽字符。@DougT:同意,它会。类似于<代码>如果(CH=‘a’& &‘我认为EBCDIC’是模糊的,足以假装它不存在。实际上,我认为安全的假设是,假设<代码>('z’-' a==25)< /> >比C++本身更便携。是的,成员<代码>查找< /C> >更容易使用(和读取)。比
中的通用版本更适用于临时
字符串
对象,甚至可以作为
字符串(“abc”).find(ch)
或用户定义的文本,
“abc”str.find(ch)
。但与
方式相比,仍然非常冗长。@BenVoigt你说得对-我大部分时间都选择
std::string
“思想原因”,尽管C库的功能在C++中也是完全好的。如果“代码> ABC”<代码>首先绑定到一个字符串。<代码> STD::Strase=“ABC”<代码>。使用“代码> StrCHR
这里是否不正确?”doChavsky:<代码> StrCHR(String,CyString(),CH)会起作用,但除非您出于其他原因拥有字符串对象,否则这将是一种浪费。
std::string
对象的构造相对昂贵。
if (strchr("abc", ch))
std::set<char> mySet = {'a','b','c'};  // C++11 initializer list

if(mySet.find('d') != mySet.end()) {
    ...
}