Die Boost C++ Bibliotheken

Kapitel 52. Boost.Foreach

Boost.Foreach bietet ein Makro an, das die mit C++11 in den Standard aufgenommene range-basierte for-Schleife simuliert. Mit dem Makro BOOST_FOREACH, das in der Headerdatei boost/foreach.hpp definiert ist, kann über Elemente in einer Sequenz iteriert werden, ohne auf Iteratoren zugreifen zu müssen. Arbeiten Sie mit einer Entwicklungsumgebung, die C++11 unterstützt, können Sie Boost.Foreach ignorieren.

Beispiel 52.1. BOOST_FOREACH und BOOST_REVERSE_FOREACH in Aktion
#include <boost/foreach.hpp>
#include <array>
#include <iostream>

int main()
{
  std::array<int, 4> a{{0, 1, 2, 3}};

  BOOST_FOREACH(int &i, a)
    i *= i;

  BOOST_REVERSE_FOREACH(int i, a)
  {
    std::cout << i << '\n';
  }
}

Das Makro BOOST_FOREACH erwartet zwei Parameter: Der erste Parameter ist eine Variable oder eine Referenz, der zweite Parameter eine Sequenz. Der Typ des ersten Parameters muss identisch sein mit dem Typ der Elemente in der Sequenz.

Als Sequenz zählt alles, was einen Iterator anbietet – zum Beispiel alle aus der Standardbibliothek bekannten Container. Boost.Foreach greift zwar nicht direkt auf die bekannten Methoden begin() und end() zu, sondern nimmt einen Umweg über die Bibliothek Boost.Range. Da diese Bibliothek jedoch auf Iteratoren aufsetzt, gilt grundsätzlich, dass alles, was Iteratoren anbietet, mit BOOST_FOREACH kompatibel ist.

Im Beispiel 52.1 wird mit BOOST_FOREACH über ein Array vom Typ std::array iteriert. Da der erste an BOOST_FOREACH übergebene Parameter eine Referenz ist, können in der Schleife Elemente im Array nicht nur gelesen, sondern auch geändert werden. So multipliziert die erste Schleife jede Zahl im Array mit sich selbst.

Die zweite Schleife greift auf das Makro BOOST_REVERSE_FOREACH zu, das genauso funktioniert wie BOOST_FOREACH, jedoch in umgekehrter Reihenfolge über eine Sequenz läuft. In dieser Schleife werden die Zahlen 9, 4, 1 und 0 in genau dieser Reihenfolge auf die Standardausgabe ausgegeben.

Sie können wie von Schleifen aus C++ gewohnt die geschweiften Klammern weglassen, wenn der Anweisungsblock hinter dem Schleifenkopf nur aus einer Anweisung besteht.

Beachten Sie, dass Sie innerhalb der Schleifen keine Operationen ausführen dürfen, die einen Iterator ungültig machen könnten. So dürfen Sie zum Beispiel nicht aus einem Vektor Elemente löschen oder ihm neue Elemente hinzufügen, während Sie über den Vektor iterieren. Letztendlich basieren BOOST_FOREACH und BOOST_REVERSE_FOREACH auf Iteratoren, die während der gesamten Iteration gültig sein müssen.