如何在if语句中搜索char数组中的char

时间:2017-05-30 11:58:49

标签: c++ if-statement char

是否有任何功能可以帮助我更轻松地完成以下操作?

char ch = '+';
if (( ch == '+') || (ch == '-') || (ch == '*'))
{
    //do something
}

由于必须在我的代码中多次检查,我更愿意是否有任何类似于

char arr ={'+','-','*'};
if (ch in arr)
{
    //do something 
}

6 个答案:

答案 0 :(得分:4)

在这种情况下,您可以使用:

if ( std::strchr("+-*", ch) )

strchr函数,来自#include <cstring>,如果在字符串中找不到该字符,则返回空指针。

答案 1 :(得分:3)

您可以编写一个生成相当于

的代码的函数
if (( ch == '+') || (ch == '-') || (ch == '*'))

使用更好的用户语法。

template <typename X>
bool any(const X&) noexcept
{
    return false;
}

template <typename X, typename T, typename... Ts>
bool any(const X& x, const T& curr, const Ts&... rest) noexcept
{
    return x == curr || any(x, rest...);
}

用法:

if(any(ch, '+', '-', '*')) { /* do something */ }

如图by this godbolt.org comparison所示,这是零成本抽象的示例。

在C ++ 17中,您可以使用fold expression

template <typename X, typename... Ts>
bool any(const X& x, const Ts&... rest)
{
    return ((x == rest) || ...);
}

如果您想多次重复使用相同的比较值而不重复自己,可以创建一个&#34; curried&#34; any的版本,它首先绑定要检查的参数,然后在后续调用中进行比较。

template <typename... Ts>
auto bound_any(const Ts&... xs)
{
    return [xs...](const auto& x)
    {
        return ((x == xs) || ...);
    };
}

用法:

auto is_op = bound_any('+', '-', '*');
if(is_op(ch)) { /* do something */ }

此处a godbolt.org comparison

答案 2 :(得分:1)

试试这个

#include <algorithm>

int main() {
   char arr[] ={'+','-','*'};
   char ch = '-';
   if(std::find(arr, arr+sizeof(arr)/sizeof(char), ch) - arr < sizeof(arr)/sizeof(char)){
   //do anything 
   }
   return 0;
}

答案 3 :(得分:0)

如果您的数组也是any,这会使==成为编译时构造。如果范围是任意的,我无法想到一种方法可以使其更加优化。

我已选择重载#include<iterator> template<typename Iter> class any { public: using value_type = typename std::iterator_traits<Iter>::value_type; constexpr any(Iter begin, Iter end) : begin{begin}, end{end} {} template<typename T, size_t N> constexpr any(T (&arr)[N]) : any{arr, arr + N} {} constexpr bool operator==(const value_type& v) { return compare(v, begin); } private: Iter begin, end; constexpr bool compare(const value_type& v, Iter it) { return it != end && (v == *it || compare(v, it + 1)); } }; template<typename T, size_t N> any(T (&)[N]) -> any<T*>; template<typename T, typename Iter> constexpr bool operator==(const T& t, any<Iter> a) { return a == t; } ,因为它看起来比并排传递参数更好。

static_assert('+' == any("+-*"), "Failure!");

constexpr char ops[] = {'+', '-', '*'};
char c = '/';
if(c == any(ops))
    do_stuff(c);

这会产生漂亮的格式

using value_type = typename std::iterator_traits<Iter>::value_type;

说明

Iter

是将value_type类型的引用别名为template<typename T, size_t N> any(T (&)[N]) -> any<T*>;

any

return it != end && (v == *it || compare(v, it + 1)); 的{​​{3}},没有明确的模板参数。

any("+-*")

是递归检查范围是否已用尽,如果没有,检查该值是否等于当前元素。

请注意,'\0'中包含 4 个字符,最后一个字符为$reflectionClass = new ReflectionClass($class_name); if ($reflectionClass->getMethod($method_name)->class == $class_name) { // do something }

答案 4 :(得分:0)

对我来说,乍一看,这是一个集合查找:是这个元素中的任何一个等同于这组元素是否包含这个元素。并且,如此:

if ((std::set<char> {'a','b','c'}).count(x) > 0) {
    // ...
}

See it on Coliru

答案 5 :(得分:0)

对于这种特定情况,您可以将布尔表达式包装在您自己的自定义函数中:

bool isOperator(char ch) {
    return ( ch == '+') || (ch == '-') || (ch == '*');
}

这将减少其余代码的冗余,因为现在你可以做到

if(isOperator(ch))