Knihovna standardních šablon (STL) ( anglicky Standard Template Library ) je sada konzistentních generických algoritmů , kontejnerů , prostředků pro přístup k jejich obsahu a různých pomocných funkcí v C++ .
Knihovna standardních šablon, než byla zahrnuta do standardu C++ , byla vývojem třetí strany, nejprve od HP a později od SGI . Jazykový standard to nenazývá „STL“, protože tato knihovna se stala nedílnou součástí jazyka, nicméně mnoho lidí stále používá tento název, aby jej odlišili od zbytku standardní knihovny (I/O streamy ( iostream ), C pododdíl atd.).
Projekt nazvaný STLPort , založený na SGI STL, udržuje třídy STL, iostream a string aktuální. Několik dalších projektů také vyvíjí soukromé využití standardní knihovny pro různé konstrukční úlohy. Každý výrobce kompilátorů C++ musí dodat nějakou implementaci této knihovny, protože je velmi důležitou součástí standardu a je široce používána.
Architekturu STL navrhli Alexander Stepanov a Meng Li.
Knihovna má pět hlavních součástí:
Separace umožňuje snížit počet součástí. Například místo psaní samostatné funkce vyhledávání prvků pro každý typ kontejneru je k dispozici jediná verze, která funguje s každým z nich, pokud jsou splněny základní požadavky.
Kontejnery STL lze rozdělit do čtyř kategorií: sekvenční, asociativní, kontejnery adaptérů a pseudokontejnery.
Kontejner | Popis |
---|---|
Sekvenční kontejnery | |
vektor [1] | Dynamické pole s náhodným přístupem podobné C s automatickou změnou velikosti, když je prvek přidán/odebrán. Přístup pomocí indexu pro . Přidání/odstranění prvku na konec vektoru trvá amortizovaný čas, stejná operace na začátku nebo uprostřed vektoru trvá . Standardní rychlé třídění pro . Hledání prvku iterací trvá . Existuje specializace vektorové šablony na typ bool , který vyžaduje méně paměti tím, že ukládá prvky jako bity, ale nepodporuje všechny funkce iterátorů. |
seznam [2] | Dvojitě propojený seznam , jehož prvky jsou uloženy v libovolných částech paměti, na rozdíl od vektorového kontejneru, kde jsou prvky uloženy v souvislé oblasti paměti. Vyhledávání podle výčtu je pomalejší než u vektoru kvůli delší době přístupu k prvku. Přístup pomocí indexu pro . Kdekoli v kontejneru je vkládání a mazání velmi rychlé - v . |
paluba [3] | Oboustranná fronta . Kontejner je jako vektor, ale se schopností rychle vkládat a odstraňovat prvky na obou koncích v . Implementováno jako dvojitě propojený seznam lineárních polí . Na druhou stranu, na rozdíl od vektoru, deque nezaručuje, že všechny jeho prvky budou umístěny v souvislé paměti , což znemožňuje bezpečné použití ukazatelové aritmetiky [4] pro přístup k prvkům kontejneru [5] [6] . |
Asociativní kontejnery | |
soubor | Seřazená sada jedinečných prvků. Při vkládání/odebírání prvků množiny se iterátory ukazující na prvky této množiny nestávají neplatnými. Poskytuje standardní operace s množinami, jako je sjednocení, průnik, odčítání. Typ prvku sady musí implementovat operátor porovnání operator<nebo musí být poskytnuta funkce komparátoru. Implementováno na základě samovyvažovacího binárního vyhledávacího stromu . |
multiset | Stejné jako sada, ale umožňuje ukládat duplicitní prvky. |
mapa | Uspořádané asociativní pole dvojic prvků sestávající z klíčů a jejich odpovídajících hodnot. Klíče musí být jedinečné. Pořadí prvků je určeno klávesami. V tomto případě musí typ klíče implementovat operátor porovnání operator<, nebo musíte poskytnout funkci komparátoru. |
multimapa | Stejné jako mapa, ale umožňuje uložit více stejných klíčů. |
Adaptérové nádoby | |
zásobník | Stoh je kontejner, do kterého se přidávají a odebírají prvky z jednoho konce. |
fronta | Fronta je kontejner, z jehož jednoho konce můžete přidávat prvky a z druhého je odebírat. |
prioritní_fronta | Prioritní fronta organizovaná tak, že největší prvek je vždy na prvním místě. |
Pseudo kontejnery | |
bitset | Slouží k uložení bitových masek. Vypadá to na vector<bool>pevnou velikost. Velikost je pevná, když je deklarován objekt bitset. Bitset neobsahuje žádné iterátory. Optimalizováno pro velikost paměti. |
základní_řetězec | Kontejner pro ukládání a zpracování řetězců. Ukládá prvky v řadě do paměti jako jeden blok, což umožňuje organizovat rychlý přístup k celé sekvenci. Položky musí být PODy . Zřetězení je definováno pomocí +. |
valarray | Šablona se používá k ukládání číselných polí a je optimalizována pro dosažení zvýšeného výpočetního výkonu. Poněkud podobné vektoru, ale postrádá většinu standardních operací s kontejnery. Operace jsou definovány na dvou valarray a na valarray a skalárním (elementově). Tyto operace lze efektivně implementovat jak na vektorových procesorech, tak na skalárních procesorech s bloky SIMD . |
Kontejnery používají k ukládání prvků sémantiku objekt po hodnotě. Jinými slovy, po přidání kontejner získá kopii prvku. Pokud je vytvoření kopie nežádoucí, použije se kontejner ukazatelů na prvky. Prvky jsou přiřazeny pomocí operátoru přiřazení a jsou zničeny pomocí destruktoru. V tabulce jsou uvedeny základní požadavky na prvky v kontejnerech:
Metoda | Popis | Poznámka |
---|---|---|
kopírovací konstruktor | Vytvoří nový prvek identický se starým | Používá se při každém vložení prvku do kontejneru |
operátor přiřazení | Nahradí obsah prvku kopií původního prvku | Používá se při každé změně prvku |
Destruktor | Ničí živel | Používá se při každém odstranění prvku |
Výchozí konstruktor | Vytvoří prvek bez argumentů | Platí pouze pro určité operace. |
operátor== | Porovnává dva prvky | Používá se při provádění operátoru== na dvou kontejnerech |
operátor< | Určuje, zda je jeden prvek menší než druhý | Používá se při provádění operátoru< na dvou kontejnerech |
Všechny "plné" standardní kontejnery splňují určitý soubor požadavků (nebo konvencí). Níže uvedená tabulka předpokládá, že C je třída kontejneru obsahující objekty typu T.
Výraz | návratový typ | Složitost | Poznámka |
---|---|---|---|
C::typ_hodnoty | T | Doba kompilace | |
C::odkaz | T | Doba kompilace | |
C::const_reference | Doba kompilace | ||
C::ukazatel | Typ ukazatele směřujícího na C::reference | Doba kompilace | Ukazatel na T |
C::iterátor | Typ iterátoru směřujícího na C::reference | Doba kompilace | Iterátor jakéhokoli typu jiného než výstupní iterátor |
C::const_iterator | Typ iterátoru ukazujícího na C::const_reference | Doba kompilace | Iterátor jakéhokoli typu jiného než výstupní iterátor |
C::typ_velikosti | Typ celého čísla bez znaménka | Doba kompilace | |
Cobj; | Konstantní | Po: obj.size() == 0 | |
C obj1; obj1 = obj2; | Lineární | Po: obj1 == obj2 | |
Cobj; (&obj)->~C(); | Výsledek není použit | Lineární | Po: obj.size() == 0. |
obj.begin() | Konstantní | ||
obj.end() | Konstantní | ||
obj1 == obj2 | Reverzibilní na bool | Lineární | |
obj1 != obj2 | Reverzibilní na bool | Lineární | |
obj.size() | size_type | Záleží na typu | Nedoporučuje se pro kontrolu, zda je nádoba prázdná |
objekt.empty() | Reverzibilní na bool | Konstantní | |
obj1 < obj2 | Reverzibilní na bool | Lineární | |
obj1 > obj2 | Reverzibilní na bool | Lineární | |
obj1 <= obj2 | Reverzibilní na bool | Lineární | |
obj1 >= obj2 | Reverzibilní na bool | Lineární | |
obj.swap(obj2) | prázdnota | Konstantní |
Knihovna STL používá jako prostředníka pro přístup k prvkům zobecněnou abstrakci zvanou iterátor . Každý kontejner udržuje „svůj vlastní“ druh iterátoru, což je „modernizovaný“ inteligentní ukazatel [7] , který „ví“, jak přistupovat k prvkům konkrétního kontejneru. Standard C++ definuje pět kategorií iterátorů, které jsou popsány v následující tabulce:
Kategorie | Podporované operace | Poznámka |
---|---|---|
Vstup | operator++, operator*, operator->, copy konstruktor, operator=, operator==, operator!= | Poskytuje přístup pro čtení v jednom směru. Umožňuje provést přiřazení nebo kopírování pomocí operátoru přiřazení a konstruktoru kopírování. |
Víkendy | operator++, operator*, konstruktor kopie | Poskytuje přístup pro zápis v jednom směru. Nelze je srovnávat z hlediska rovnosti. |
Jednosměrný | operátor++, operátor*, operátor->, kopírovací konstruktor, výchozí konstruktor, operátor=, operátor==, operátor!= | Poskytuje přístup pro čtení a zápis ve stejném směru. Umožňuje provést přiřazení nebo kopírování pomocí operátoru přiřazení a konstruktoru kopírování. Lze je srovnávat z hlediska rovnosti. |
Obousměrný | operátor++, operátor--, operátor*, operátor->, kopírovací konstruktor, výchozí konstruktor, operátor=, operátor==, operátor!= | Podporuje všechny funkce popsané pro jednosměrné iterátory (viz výše). Navíc umožňují přejít na předchozí prvek. |
náhodný přístup | operátor++, operátor--, operátor*, operátor->, kopírovací konstruktor, výchozí konstruktor, operátor=, operátor==, operátor!=, operátor+, operátor-, operátor+=, operátor-=, operátor<, operátor>, operátor < =, operátor>=, operátor[] | Ekvivalentní k běžným ukazatelům: podpora aritmetiky ukazatele, syntaxe indexování pole a všechny formy porovnávání. |
C++ | |
---|---|
Zvláštnosti | |
Některé knihovny | |
Kompilátory | |
ovlivnil | |
|