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>: 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 upstrchr()
。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 std::string
对象的构造相对昂贵。
if (strchr("abc", ch))
std::set<char> mySet = {'a','b','c'}; // C++11 initializer list
if(mySet.find('d') != mySet.end()) {
...
}