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.