Die Boost C++ Bibliotheken

Kapitel 20. Boost.Container

Boost.Container ist eine Boost-Bibliothek, die die gleichen Container wie die Standardbibliothek anbietet. Dabei legt Boost.Container Wert auf zusätzliche Flexibilität. So können zum Beispiel alle Container dieser Bibliothek mit Boost.Interprocess in Shared Memory verwendet werden – etwas, was mit Containern aus der Standardbibliothek nicht zwangsläufig möglich ist.

Boost.Container bietet weitere Vorteile:

Beispiel 20.1 zeigt, was mit unvollständigen Typen gemeint ist.

Beispiel 20.1. Rekursive Container mit Boost.Container
#include <boost/container/vector.hpp>

using namespace boost::container;

struct animal
{
  vector<animal> children;
};

int main()
{
  animal parent, child1, child2;
  parent.children.push_back(child1);
  parent.children.push_back(child2);
}

Die Klasse animal besitzt eine Eigenschaft children, deren Typ boost::container::vector<animal> ist. boost::container::vector ist in der Headerdatei boost/container/vector.hpp definiert. Der Typ der Eigenschaft children basiert demnach auf der Klasse animal, in der children definiert ist. Zum Zeitpunkt des Zugriffs ist animal nicht vollständig definiert. Während der Standard für Container aus der Standardbibliothek keine explizite Unterstützung für unvollständige Typen vorsieht, sind rekursive Container mit Boost.Container explizit möglich. Es hängt von der Implementation der Standardbibliothek ab, ob dies auch mit Containern aus dieser möglich ist.

Beispiel 20.2. boost::container::stable_vector in Aktion
#include <boost/container/stable_vector.hpp>
#include <iostream>

using namespace boost::container;

int main()
{
  stable_vector<int> v(2, 1);
  int &i = v[1];
  v.erase(v.begin());
  std::cout << i << '\n';
}

Boost.Container bietet neben den aus der Standardbibliothek bekannten Containern weitere an. So wird im Beispiel 20.2 mit boost::container::stable_vector ein Container vorgestellt, der sich ähnlich wie std::vector verhält. Werden boost::container::stable_vector Elemente hinzugefügt oder werden Elemente entfernt, bleiben jedoch Iteratoren und Referenzen auf bestehende Elemente gültig. Dies ist möglich, weil die Elemente im boost::container::stable_vector nicht in einem zusammenhängenden Speicherblock liegen. Es kann weiterhin mit einem Index auf Elemente zugegriffen werden. Elemente liegen jedoch nicht direkt nebeneinander im Speicher.

Boost.Container garantiert, dass die Referenz i im Beispiel 20.2 gültig bleibt, wenn das erste Element im Vektor gelöscht wird. Das Beispielprogramm gibt demnach 1 aus.

boost::container::stable_vector ist in der Headerdatei boost/container/stable_vector.hpp definiert.

Weitere von Boost.Container angebotene Container sind boost::container::flat_set, boost::container::flat_map, boost::container::slist und boost::container::static_vector: