Bedingung basiert auf Schleifenauswahl.Auswählen einer for-Schleife basierend auf if-Bedingung
Wie erreicht man das in C++?
Bedingung basiert auf Schleifenauswahl.Auswählen einer for-Schleife basierend auf if-Bedingung
Wie erreicht man das in C++?
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(...);
}
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';
}
}
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).
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;
}
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);
Verwenden Sie eine gemeinsame Funktion innerhalb des Schleifenkörpers? – Lundin
Wenn Sie Zugriff auf C++ 14 haben, verwenden Sie 'std :: for_each' und übergeben Sie ein generisches Lambda. – StoryTeller
@StoryTeller: 'std :: for_each' mit einer zusätzlichen Abbruchbedingung? Das wäre wahrscheinlich ziemlich hässlich/ineffizient – MikeMB