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:
Die Schnittstellen der Container stehen denen aus der C++11-Standardbibliothek in nichts nach. So können Sie auch in C++98-Programmen zum Beispiel auf Methoden wie emplace_back() zugreifen, die erst mit C++11 zur Standardbibliothek hinzugefügt wurden.
Mit boost::container::slist oder boost::container::stable_vector werden zusätzliche Container angeboten, die in der Standardbibliothek fehlen.
Die Implementation ist plattformunabhängig. Die Container verhalten sich überall gleich, so dass Sie sich nicht um mögliche Unterschiede zwischen Implementationen der Standardbibliothek kümmern müssen.
Die Container von Boost.Container unterstützen unvollständige Typen und können verwendet werden, um rekursive Container zu definieren.
Beispiel 20.1 zeigt, was mit unvollständigen Typen gemeint ist.
#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.
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:
boost::container::flat_set und boost::container::flat_map ähneln std::set und std::map, sind jedoch nicht als Baum, sondern als sortierte Vektoren implementiert. So ist ein schnellerer Zugriff auf wie auch eine schnellere Iteration über Elemente möglich. Das Einfügen und Entfernen von Elementen ist jedoch langsamer.
Die beiden Container sind in den Headerdateien boost/container/flat_set.hpp und boost/container/flat_map.hpp definiert.
boost::container::slist ist eine einfach verkettete Liste. Sie ähnelt dem Container std::forward_list, der in C++11 neu in die Standardbibliothek aufgenommen wurde. boost::container::slist bietet die Methode size() an, die bei std::forward_list fehlt.
boost::container::slist ist in der Headerdatei boost/container/slist.hpp definiert.
boost::container::static_vector speichert Elemente ähnlich wie std::array direkt im Container. Ähnlich wie std::array besitzt der Container eine konstante Kapazität. Die Kapazität sagt jedoch nichts über die Anzahl der Elemente im Container aus. Mit push_back(), pop_back(), insert() und erase() stehen mehrere Methoden zur Verfügung, um Elemente hinzuzufügen oder zu entfernen. In dieser Hinsicht ähnelt boost::container::static_vector std::vector. So existiert mit size() auch eine Methode, um die Anzahl der momentan im Container gespeicherten Elemente zu erhalten.
Die Kapazität ist konstant, kann jedoch mit resize() neu gesetzt werden. push_back() ändert die Kapazität jedoch nicht. Sie dürfen mit push_back() nur dann ein Element hinzufügen, wenn die Kapazität größer als die Anzahl der momentan gespeicherten Elemente ist. Andernfalls wirft push_back() eine Ausnahme vom Typ std::bad_alloc.
boost::container::static_vector ist in der Headerdatei boost/container/static_vector.hpp definiert.