Zastąpienie wielokrotnego OR | |

0

Witam .
Czy można w c++ takie wyrażenie np
if (liczba==0 || liczba==2 || liczba ||43 itd)
zastapic cos w stylu if (liczba in(0,2,43))???

0
awalknek napisał(a)

if (liczba in(0,2,43))???
Obawiam się, że takie coś to tylko w C# ;-)

Spróbuj czegoś takiego:

	bool warunek = false;
	int liczba;
	int liczby[] = {0, 2, 43};
	
	for (int i = 0; i < sizeof(liczby)/sizeof(int); i++)
		warunek |= ( liczba == liczby[i] );
	
	if (warunek) { /*...*/ }
0

ewentualnie możesz sobie na to makro napisać

0

no właśnie, może taką funkcję wstawić:

template<class Type, class Element, int n>
bool in_group(const Type value, const Element (&array)[n]) {
    return std::find(array, array+n, value) != array+n;
    }

// i później jechać...

int array[] = { 3,5,7,2 };
if( in_group(4, array) ) { /* ... */ }

ewentualnie, jak muusowo musisz mieć wszystko w ifie, to możesz takie coś wykombinować, ale nie licz na to, że to będzie efektywniejsze:

template<class Type>
class in_group_helper {
    private:
        Type value;
        mutable bool result;
    public:
        in_group_helper(const Type& v) : value(v), result(false) { }
        const in_group_helper& operator|(const Type& n) const {
            result |= (value==n);
            return *this;
            }
        operator bool() const { return result; }
    };

template<class Type>
in_group_helper<Type> in_group(const Type& value) {
    return in_group_helper<Type>(value);
    }

i później chcąc sprawdzić, czy 4 leży w zbiorze {3,5,7,2} piszesz:

if( in_group(4) | 3|5|7|2  ) /* ... */

ot, takie sobie dwie koncepcje-snippety, bo mi się nudzi ;)

0

Jest gotowy standardowy szablon: std::set<>, ale w twoim przypadku może być to za duża armata.
Inne rozwiązanie to standardowe algorytmy:

const int Zbior1[] = {3,7,2,5};
if(std::find(Zbior1,Zbior1+4,2))
    ....
0
MarekR22 napisał(a)

Inne rozwiązanie to standardowe algorytmy:

const int Zbior1[] = {3,7,2,5};
if(std::find(Zbior1,Zbior1+4,2))
    ....

A jak liczb jest dużo, to można je posortować i wyszukiwać binarnie.

Btw, te liczby są całkowicie przypadkowe, czy mają jakieś wspólne cechy ?

0

a czemu nie zastosować w tym przypadku zwykłego switcha ?
np.

switch(liczba) {
    case 2 :
    case 4 :
    case 42 :
        robiCostam();
    break;
}

zauważ że po case 2 4 nie ma "break";

zrobi swoje a na pewno dodać jedną linijke w razie potrzeby np "case 6 " to nie problem. Chyba że to ma być coś dynamicznego ale troche mało danych :P

0

temu - ze rozwiazania ze switchem nie da sie przeniesc np. na stringi ;)

0

Ale tu nie mamy stringów :>

0

no ale cholera wie, czy jutro nie będzie trzeba pracować na floatach...
poza tym - wcale nie jest krótszy co tu dużo mówić, to już chyba lepiej

if( (a==x) || (b==x) || (c==x) ) { /* ... */ } 

niż

switch(x) {
  case a:
  case b:
  case c:
    /* ... */
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1