2013-02-21 15 views
11

Ich hätte gerne Ihren Rat bezüglich der Verwendung von BOOST_FOREACH.BOOST_FOREACH versus für Schleife

Ich habe gelesen, es ist nicht wirklich empfehlenswert in Bezug auf die Leistung ein sehr schwerer Header ist.

Darüber hinaus zwingt es die Verwendung von "Break" und "Continue" -Anweisungen, da Sie nicht wirklich eine Exit-Bedingung von einem Boolean gefahren haben und mir wurde immer gesagt, dass "Pause" und "weiter" vermieden werden sollte wenn möglich.

Die Vorteile sind natürlich, dass Sie nicht direkt mit Iteratoren arbeiten, die die Aufgabe der Iteration durch einen Container erleichtern.

Was denken Sie darüber? Sind Sie der Meinung, dass, sollte es verwendet werden, es systematisch angenommen werden sollte, um die Homogenität in einem Projekt zu gewährleisten, oder wird seine Verwendung nur unter bestimmten Umständen empfohlen?

+4

"und mir wurde immer gesagt, dass" break "und" continue "wenn möglich vermieden werden sollten." Kannst du bitte aufstehen? – utnapistim

+8

IIRC Es gab Gründe, um zu brechen und in den guten alten Zeiten, in denen Leute keine RAII-Muster hatten, weiter zu machen und Optmimizer könnten in Probleme geraten, wenn Schleifen zu "nervös" werden würden. Das waren die Tage des "single entry single exit" -Dogmas, wo Funktionen nur eine Rückmeldung, Tonnen von ifs und einige goto's hatten.Und es gibt Menschen, die diese Dogmen vor Äonen gelernt haben, sie nie in Frage gestellt haben und sie in Zeiten, in denen sie keinen Sinn, aber viel Ärger machen, an Jugendliche weitergeben. –

+0

Während ich mit Ihnen stimme, muss ich sagen, dass es wert sein könnte, in for-Schleifen keine Pause zu verwenden oder fortzufahren. Wenn Sie diese Schlüsselwörter while-Schleifen reservieren und zustimmen, sie nicht in for-Schleifen zu verwenden, wird die Absicht klarer. Aber das ist einfach zu viel IMHO, ich würde es nicht empfehlen. – MatiasFG

Antwort

18

Ich würde sagen, dass C++ range based Schleifen es übertreffen. Dies ist ein Äquivalent this BOOST_FOREACH example:

std::string hello("Hello, world!"); 
for (auto c : hello) 
{ 
    std::cout << c; 
} 

Ich fand nie, dass ich brauchte es 03 ++ zu verwenden, bei.

Hinweis wenn die basierend Schleife über Behälter mit teueren unter Verwendung von Elementen zu kopieren, oder in einem allgemeinen Kontext, ist es am besten const& auf diese Elemente zu verwenden:

SomeContainerType<SomeType> v = ....; 
for (const auto& elem : v) 
{ 
    std::cout << elem << " "; 
} 

Und falls Sie ned Ändern Sie die Elemente des Containers, verwenden Sie eine nicht-const & (auto& elem : v).

+0

Ich denke, Sie sollten [const] auto & die meiste Zeit verwenden - sonst erhalten Sie eine Kopie – Daniel

+0

detailliertere Beschreibung: http://msdn.microsoft.com/en-us/library/vstudio/dd293667.aspx (Referenzen und Lebenslauf -Qualifier) ​​ – Daniel

+0

@Daniel Ja, aber in seinem Fall haben wir single 'char's, und ich habe versucht, das Äquivalent des' BOOST_FOREACH' Beispieles zu schreiben. – juanchopanza

7

In der Programmierung ist Klarheit Trumpf. Ich habe immer boost foreach in C++ 03 verwendet, fand es viel lesbarer als die handgeschriebene Schleife, die Header-Größe wird dich nicht töten. Wie @juanchopanza zu Recht bemerkt, ist diese Frage natürlich in C++ 11 veraltet.

Ihre Bedenken mit Pause und Fortfahren sind unbegründet und wahrscheinlich kontraproduktiv. Mit den traditionell langen for-loop-Headern von C++ 03 neigen die Leute dazu, nicht lesen Sie die Schleife Header und übersehen alle Zustandsvariablen, die in der Schleife Header ausblenden. Besser machen Sie Ihre Absicht explizit mit Pause und weiter.

Wenn Sie sich entschieden haben, Boost foreach zu verwenden, verwenden Sie es systematisch. Es soll schließlich dazu dienen, die Brot-und-Butter-Loops zu ersetzen.

0

Ich habe gerade eine Verwendung von BOOST_FOREACH durch eine einfache for-Schleife ersetzt und bekam eine 50% ige Beschleunigung, also würde ich sagen, dass es definitiv nicht immer das Beste ist. Sie erhalten auch keinen Schleifenzähler (z. B. "i"), den Sie manchmal benötigen. Persönlich bin ich kein Fan, aber YMMV, wenn es Ihrem Stil besser passt.

BTW - eine "schwere Kopfzeile" wird die Leistung Ihres Programms nicht beeinflussen, nur die Übersetzungszeit.