È una cattiva forma per uscire da Range per

0

Ho un range basato su che opera su un std::vector di oggetti ( item s), in questo modo:

for(auto item : itemCollection)
{
   if(!item.some_check(...))
   {
      // do 5% stuff
      break;
   }

   // do the 95% stuff
}

La maggior parte delle volte (> 95%) il ciclo funziona sull'intero contenitore, tuttavia, se some_check() restituisce un false (circa il 5% delle volte), si interromperà all'inizio del ciclo .

È considerata una cattiva forma per uscire da un range-based? Dovrei invece usare un while o un C ++ 03-style for(...;...;...) qui?

    
posta Bhargav Bhat 04.02.2015 - 04:35
fonte

2 risposte

2

No, non è mai una cattiva forma uscire da un loop in anticipo a meno che non si sia consapevoli di una invariante che si interromperà sempre in anticipo. Ho visto i loop processare solo il primo elemento:

for (auto item : itemCollection) {
  // do the 95% stuff
  break;
}

Questo codice non dovrebbe mai essere usato, sfortunatamente l'ho visto in codice di produzione più volte in passato. Ovviamente ciò ha richiesto una revisione del codice.

Ad ogni modo, questo non sembra essere il tuo caso. Vorrei comunque riconsiderare il design del tuo algoritmo. Perché uscire dal ciclo solo perché un elemento da qualche parte nel contenitore fallisce un controllo? Perché non saltare questo elemento? Forse guardando il quadro generale si rivelerà un modo migliore di fare qualsiasi cosa tu stia cercando di fare. Per me è difficile dare più indicazioni senza più del codice e del design complessivo.

    
risposta data 04.02.2015 - 06:38
fonte
0

Sarei almeno tentato di fare qualcosa del tipo:

auto pos = std::find_if(items.begin(), items.end(), 
      [](item const &i) { return i.check(); });

std::foreach(items.begin(), pos, [](item const &i) { /* 95% stuff */ });

if (pos != items.end())
    pos->rare_stuff();

Questo può (o non può) essere marginalmente più lungo, ma a me l'intento sembra più chiaro.

    
risposta data 13.02.2015 - 02:24
fonte

Leggi altre domande sui tag