有没有办法将 a与 schar
列表中的每个元素进行比较char
?
char ch;
if(ch == 'a' || ch == 'b' || ch == 'c')
有什么办法可以做
if(ch is one of {a, b, c})
有没有办法将 a与 schar
列表中的每个元素进行比较char
?
char ch;
if(ch == 'a' || ch == 'b' || ch == 'c')
有什么办法可以做
if(ch is one of {a, b, c})
当你能做到的时候,你为什么要编写 lambdas 或使用一次性字符串对象:
if (strchr("abc", ch))
采用 :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>
也可以尝试一下。
你可以使用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) {
...
}
(这个答案真的只适用于你不想使用 C++ 标准库结构的情况。)
在您的具体情况下,您应该能够:
if(ch >= 'a' && ch <= 'c')
对于这种情况,我还使用了直通开关:
switch(ch)
{
case 'a':
case 'b':
case 'c':
case 'e':
...
break;
}
有些人不喜欢通过 switch/case 语句,但我认为它比大量布尔逻辑更不容易出错,并且比为此目的使用数据结构更好。编译器非常擅长处理 switch 语句。
如果您可以使用 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
是其中之一)也应该可以工作。
希望能帮助到你。祝你好运!
作为另一种选择,set
使用字符创建一个,并检查它是否包含在那里;
std::set<char> mySet = {'a','b','c'}; // C++11 initializer list
if(mySet.find('d') != mySet.end()) {
...
}
我有点惊讶没有人建议 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++;
}
这样做的一个很好的好处是,通过将更频繁的字符放在字符串的前面,可以节省一点时间。