2012-10-17 12 views
5

Witam mam poniższy kod:Zoptymalizowany sposób sprawdzić wartość zmiennej o wartości członkowie enum

enum {a, b, c, d, ..., z} abc; 

int main() 
{ 
    int val = 20; 
    if (val == a || val == b ||val == c||val == d..... || val == z) 
    { 
    /*Do something*/ 
    } 
} 

Czy jest jakiś inny sposób, tak, że możemy pominąć operację OR bo jeśli istnieją 1000s wyliczenia członków, a następnie jak możemy zrobić z wyprzedzeniem ze sprawdzaniem wszystkich członków. Proszę o pomoc.

+4

'if (val> = a || val <= z) {/ * coś * /}' – jrok

+0

@jrok: Jeśli 'a = 1' i 'd = 20', a następnie? –

+2

Twój opublikowany kod jest niepoprawny. Stosuje bitowe "lub" do wartości 'a',' b', 'c', ... i porównuje' val' z wynikiem. (I poprawną deklaracją dla 'main' jest' int main (void) 'dla C,' int main() 'dla C++.) –

Odpowiedz

0

Od wartości wyliczający przypisane są sekwencyjnie, stawiając if jak to byłoby na tyle:

if (val < = oo)

+1

wartość sekwencyjna dla wyliczenia nie jest regułą, którą można wyliczyć {a = 1; b = 4; c = 34 ..} abc; co jest ważne w C++ –

+2

oczywiście. ale w tym przykładzie są one przypisywane sekwencyjnie. – Alican

+0

@AdrianHerea: I równie ważny C, ale ma znaczenie tylko wtedy, gdy typ wyliczenia jest zdefiniowany w ten sposób. –

0

Można korzystać z mapy w C++. Dzięki mapie możesz napisać kompaktowy test bez licznych == i ||.

Ale najpierw musisz zainicjować mapę i nie jestem pewien, czy możesz przeprowadzić tę inicjalizację w zwarty sposób dla dowolnego wyliczenia.

#include <iostream> 
#include <map> 

using namespace std; 

enum abc { a = 1, b = -1, c = 3, d = 0 }; 

int main() 
{ 
    map<int, int> m; 
    m[a] = m[b] = m[c] = m[d] = 1; 
    cout << "b is " << ((m.find(b) == m.end()) ? "NOT " : "") << "in m" << endl; 
    cout << "3 is " << ((m.find(3) == m.end()) ? "NOT " : "") << "in m" << endl; 
    cout << "10 is " << ((m.find(10) == m.end()) ? "NOT " : "") << "in m" << endl; 
    return 0; 
} 

wyjściowa (ideone):

b is in m 
3 is in m 
10 is NOT in m 
5

nowoczesny kompilator powinien po prostu być w stanie zoptymalizować takiego kodu, jeśli, tak jak w przypadku, gdy wartość wyrażenia jest znany w czasie kompilacji. Dla czytelności i sprawdzania błędów Myślę, że przy użyciu switch byłoby lepiej:

switch (val) { 
case a:; 
case b:; 
.... 
// your code goes here 
} 

Jak powiedział, wydajność mądry tam nie powinno być dużej różnicy, kompilator będzie przekształcić to do przeszukiwania tablicy (lub innych sprytnych rzeczy) w razie potrzeby lub całkowicie go zoptymalizuj, jeśli val jest znane w czasie kompilacji.

Ale tutaj możesz mieć przewagę sprawdzania kompilatorów błędów. Jeśli nie masz przypadku default, większość kompilatorów wyświetli ostrzeżenie, jeśli pominiesz jedną ze stałych wyliczeniowych. Sądzę również, że jest to bardziej przejrzyste, ponieważ nie powtarza się wszędzie oceny val.

1

inne rozwiązanie (szybciej) będą następujące

bool isInenum (int val) 
{ 
    bool retVal = false 
     switch(val) 

    { 
     case a: 
     case b: 
     case c: 
     case d: 
      { 
       retVal = true; 
      } 

    } 
    return retVal; 
} 
Powiązane problemy