C ++比较整数和硬编码整数集的简单方法

时间:2018-03-14 03:37:50

标签: c++

我正在使用C ++进行粒子物理学,我发现自己正在写这样的行:

bool isItCorrect(int i){
 if(i==11 || i == 62 || i==-11 || i == 11002 || i==22002) return True
 else return false;
}

对我来说,最简单的方法是在C ++中缩短它。在python我能做到:

def isItCorrect( i ):
    if (i is in [11,62,-11,11002,22002]) return True
    else return False

5 个答案:

答案 0 :(得分:5)

您可以在C ++ 11中使用可变参数模板并定义:

template <typename T, typename T1>
bool isItCorrect(T t, T1 t1) {
  return t == t1;
}
template <typename T, typename T1, typename... T2>
bool isItCorrect(T t, T1 t1, T2... t2) {
  return t == t1 || isItCorrect(t, t2...);
}

并使用:

bool isItCorrect(int i) {
    return isItCorrect(i, 62, -11, 110022, 22002);
}

答案 1 :(得分:4)

它可能不是最简单的&#34;,但我通常只使用switch,例如:

bool isItCorrect(int i)
{
    switch (i)
    {
        case 11:
        case 62:
        case -11:
        case 11002:
        case 22002:
            return true;
        default:
            return false;
    }
}

答案 2 :(得分:2)

std::set提供了一个计数函数,其功能与python中的is in非常相似。

bool isItCorrect(int i) {
  return std::set<int>({11, 62, -11, 110022, 22002}).count(i);
}

答案 3 :(得分:1)

您可能可以使用以下内容:您可以将std向量包装到结构中,然后编写一个函数,该值将对该字段进行检查。如果您知道该字段的所有元素是时间的话,这将是有效的。

#include <iostream>
#include <vector>

struct field {
    std::vector<int> data { 11, 62, -11, 11002, 22002 };
};

bool isItCorrect( int i, const field& f ) {
    for ( auto& d : f.data ) 
        if ( d == i ) return true;
    return false;
}

int main() {
    field f;

    std::cout << std::boolalpha;
    std::cout << isItCorrect( 2, f ) << std::endl;
    std::cout << isItCorrect( 62, f ) << std::endl;

    std::cout << "\nPress any key to quit.";
    std::cin.get();
    return 0;
}

<强>输出

false
true

Press any key to quit.

如果您正在使用任意类型,并且您不知道要检查多少元素,可以使用可变参数函数模板和参数包对其进行模板化:

<强> fieldT.h

#ifndef FIELD_T_H
#define FIELD_T_H

#include <vector>
#include <type_traits>

template<class T>
class fieldT {
private:
    std::vector<T> _data;

public:
    explicit fieldT( std::vector<T>& data ) : _data( data ) {}

    template<class... Args>
    fieldT( Args&&... args ) : 
      _data { std::forward<Args>( args )... } {}

    std::vector<T> data() {
        return _data;
    }
};

template<class T>
bool isItCorrectT( T t, fieldT<T>& f );

template<class T, class... Args>
bool isItCorrectT( T t, Args... args );

#include "fieldT.inl"  

#endif // FIELD_T_H 

<强> fieldT.inl

template<class T>
bool isItCorrectT( T t, fieldT<T>& f ) {
    for ( auto& d : f.data() )
        if ( d == t ) return true;
    return false;
}

template<class T, class... Args>
bool isItCorrectT( T t, Args... args ) {
    fieldT<T> f( args... );
    for ( auto& d : f.data() )
        if ( d == t ) return true;
    return false;
} 

在这里,我将类转换为类模板,然后我也模拟了函数isItCorrect,只创建了2个重载。一个将接受要检查的值和fieldT<T>对象,其中第二个重载将接受要检查的值以及该类型的任意数量的参数。

以下是使用重载方法使用上述类模板的演示 对于类的每个构造函数:

#include <iostream>
#include <vector>

#include "fieldT.h"

int main() {
    std::cout << std::boolalpha;

    // First create a vector of floats and instantiate a field<float> passing in that vector.
    std::vector<float> floats { 1.0f, 1.1f, 1.2f, 1.3f, 1.4f };
    fieldT<float> ff( floats );

    // checking for both true and false case using the fieldT<T> above
    std::cout << isItCorrectT( 2.0f, ff ) << std::endl;
    std::cout << isItCorrectT( 1.2f, ff ) << std::endl;

    // Or we can pass the values directly into the function as the
    // overloaded version will take all but the first parameter
    // and create a field<T> object populating its internal vector.
    std::cout << isItCorrectT( 1.5f, 2.9f, 7.5f, 3.4f ) << std::endl;
    std::cout << isItCorrectT( 1.5f, 2.9f, -3.7f, 1.5f, 8.9f ) << std::endl;

    std::cout << "\nPress any key to quit.";
    std::cin.get();
    return 0;
} 

<强>输出

false
true
false
true

Press any key to quit.

真正的好处在于它仍然是通用的和可移植的,并且可以用于<T>的任意数量的任意数量<T>

我没有添加任何测试以确保第一个之后的值属于<T>类型但是其中一个应该能够轻松地assert

正如你在主要内部所看到的那样。实际的函数调用非常干​​净,易于阅读和使用。即使是类和操作它的函数也非常干净和易读,易于理解,最重要的是它们是通用的,可移植的,可重用的。

答案 4 :(得分:1)

bool isItCorrect(int i)
{
    set<int> correctNums { 11, 62, -11, 11002, 22002 };

    return correctNums.find(i) != correctNums.end();
}

我相信这是最简单的方法。