De Standard Template Library (STL)

De Standard Template Library is een C++ library voor containers en containeralgoritmes, d.w.z. gelinkte lijsten, stapels, sorteeralgoritmes etc. Tegenwoordig maakt STL deel uit van de Standard C++ Library.

Wie STL gebruikt zal tijd en kosten besparen. De library is zeer performant en tegelijk flexibel, en ze is bovendien grondig getest.

STL concepten

De drie belangrijkste concepten in STL zijn containers, algoritmes en iteratoren.

Containers zijn datastructuren die een (groot) aantal elementen kunnen bevatten. Voorbeelden: een tabel (array), een gelinkte lijst, een binaire zoekboom, een stapel, enz. Klassen en structs rekent men niet tot de containers.
Elk type container slaat de elementen op een specifieke manier op, waardoor bepaalde operaties meer of minder efficiënt zijn. Bij een array bijvoorbeeld is random toegang (d.m.v. operator[]) zeer efficiënt, maar het tussenvoegen of wissen van een element niet. Net omgekeerd is het bij een gelinkte lijst. Een binaire boom is dan weer geconcipieerd om snel opzoeken mogelijk te maken. De keuze van container wordt bepaald door de programmeur op basis van criteria zoals snelheid (bij de meest voorkomende operaties) en geheugenvereisten. De standard library (of STL) voorziet een aantal belangrijke en veel gebruikte containers: vector, list, stack, queue, set, map enz. Deze worden verder uitgebreider besproken.

Behalve containers biedt de STL een aantal interessante algoritmes aan. Deze algoritmes kunnen op elk type container werken, zolang die container aan een aantal voorwaarden voldoen. De ingebouwde STL-containers voldoen automatisch aan die voorwaarden. Bovendien is het vrij eenvoudig zelf-gemaakte containers STL-conform te maken.

De STL-algoritmes zijn vrij algemeen van aard. Typische toepassingen zijn kopiëren van een containers, sorteren, zoeken, manipuleren van alle elementen etc.

Een centraal concept in STL is de iterator. Een iterator is een veralgemeende pointer. Het is een object dat wijst naar een element van een container en dat de mogelijkheid heeft naar het volgende element te springen.

De meest eenvoudige iterator is de klassieke pointer. Men kan echter zelf een klasse definiëren die de nodige operatoren overlaadt om het gedrag van een pointer te imiteren. Men noemt iteratoren ook wel eens smart pointers.

Sommige (nuttige) datastructuren, zoals bomen en grafen, zul je niet in de STL vinden, althans niet in de huidige versie. Het was niet mogelijk om alle mogelijke varianten van datastructuren te voorzien. Men heeft getracht enkele basiscontainers zo goed mogelijk te implementeren.
SGI, een van de belangrijkste softwarefabrikanten die de beste STL-implementatie maakt, heeft op eigen initiatief enkele uitbreidingen toegevoegd, waaronder has_set en hash_map.

Alle elementen in een STL-container moeten van hetzelfde datatype zijn. Men spreekt van een "homogene" container. Dit type wordt gespecifieerd als template-parameter bij de declaratie/definitie van de container; zo is list<int> een lijst gehele getallen, stack<string> een stapel strings enz.
Wanneer een element toegevoegd wordt aan een container dan is dit steeds een kopie, en niet een verwijzing (pointer of reference) naar dat element! Dit betekent dat de container zelf de verantwoordelijkheid heeft over zijn elementen wat betreft allocatie en deallocatie...
Indien men toch wenst dat de container enkel verwijzingen bevat naar (elders gealloceerde) elementen, dan kan dit door pointers te nemen als elementen. Vergeet in dat geval niet zelf de elementen te dealloceren!... Een bijkomend voordeel van pointer-elementen is dat het polymorfisme toelaat: elk element is een pointer die wijst naar een object van een basisklasse, ofwel naar een object van een klasse die erft van die basisklasse. Op die manier kan men toch een pseudo-heterogene container verkrijgen.
Opm. in Java bevatten object-containers (bv. Array) automatisch references naar objecten, zodat new voor elk element apart nodig is, en zodat elk element polymorf kan zijn.

Alle klassen en functies van de standard library bevinden zich in de namespace std. De headerbestanden worden zonder .h geincludeerd!!

[W. Schepens sept. 2003]