2016-04-26 4 views
2

Bedingung basiert auf Schleifenauswahl.Auswählen einer for-Schleife basierend auf if-Bedingung

Wie erreicht man das in C++?

+3

Verwenden Sie eine gemeinsame Funktion innerhalb des Schleifenkörpers? – Lundin

+0

Wenn Sie Zugriff auf C++ 14 haben, verwenden Sie 'std :: for_each' und übergeben Sie ein generisches Lambda. – StoryTeller

+0

@StoryTeller: 'std :: for_each' mit einer zusätzlichen Abbruchbedingung? Das wäre wahrscheinlich ziemlich hässlich/ineffizient – MikeMB

Antwort

3

Sie haben keine andere Wahl, als den gemeinsamen Teil in einer Funktion, ganz grob wie diese setzen:

void somefunction(...) 
{ 
    //this is common for both for loops 
} 

if (valid) 
{ 
    for (std::multimap<int,int>::reverse_iterator rit=id_count.rbegin(); mcount<10 && rit!=id_count.rend();++rit) 
    somefunctiuon(...); 
} 
else 
{ 
    for (std::multimap<int,int>::iterator rit=id_match.begin(); mcount<10 && rit!=id_match.end();++rit) 
    somefunctiuon(...); 
} 
1

Dies ist wohl am nützlichsten als Illustration, dass es nicht lohnt sich die Schleifenlogik kombiniert, obwohl es funktioniert. Vorausgesetzt, hier für Interesse Wert ...

#include <iostream> 
#include <map> 

int main() 
{ 
    std::multimap<int,int> id_count = { {1,2}, {9, -2}, {1,44}, {2,3}, {3,5}, {7,34} }; 

    for (int valid = 0; valid < 2; ++valid) 
    { 
     std::cout << "valid " << valid << '\n'; 
     int mcount = 0; 
     for (std::multimap<int,int>::iterator it = valid ? id_count.rbegin().base() 
                 : id_count.begin(); 
      mcount<10 && (valid ? it--!=id_count.begin() : it!=id_count.end()); 
      (valid ? it : ++it), ++mcount) 
     { 
      std::cout << "[mcount " << mcount << "] " 
       << it->first << ',' << it->second << '\n'; 
     } 
     std::cout << '\n'; 
    } 
} 
1

Sie eine Template-Funktion erstellen:

#include <map> 
#include <iostream> 

template<typename I> void func(I begin, I end) { 
    int mcount = 0; 
    for (I it = begin; mcount < 10 && it != end; ++it) { 
     ++mcount; 
     std::cout << "[mcount " << mcount << "] " 
      << it->first << ',' << it->second << '\n'; 
    } 
} 

int main() { 
    std::multimap<int,int> id_count = { {1,2}, {9, -2}, {1,44}, {2,3}, {3,5}, {7,34} }; 
    for (int valid = 0; valid < 2; ++valid) { 
     std::cout << "valid " << valid << '\n'; 
     if (valid) { 
      func(id_count.rbegin(), id_count.rend()); 
     } else { 
      func(id_count.begin(), id_count.end()); 
     } 
     std::cout << '\n'; 
    } 
} 

Aber IMHO ist diese Lösung ein wenig kompliziert, so dass andere Weisen betrachtet (wie die Schleifenkörper in einer Platzierung Funktion).

0

Sie können versuchen, "#if gültig", wie:

#if 0 for(i=1;i<10;++i) #else for(i=2;i<9;++i) #endif { cout << i << endl; }

0

In C++ 14 Sie auch eine Option zu verwenden, generische lambdas:

auto common_code = [/* Capture state if needed */] (auto& Iter) 
{ 
    // Your common code 
}; 

if (valid) 
    for (std::multimap<int, int>::reverse_iterator rit = id_count.rbegin(); mcount < 10 && rit != id_count.rend(); ++rit) 
     common_code(rit); 
else 
    for (std::multimap<int, int>::iterator rit = id_match.begin(); mcount < 10 && rit != id_match.end(); ++rit) 
     common_code(rit); 
Verwandte Themen