Standardní knihovna šablon

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 9. srpna 2022; ověření vyžaduje 1 úpravu .

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.

Struktura knihovny

Knihovna má pět hlavních součástí:

  1. Kontejner ( anglicky  container ) - uložení sady objektů do paměti.
  2. Iterátor ( anglicky  iterator ) - poskytující prostředky pro přístup k obsahu kontejneru.
  3. Algoritmus je  definice výpočetní procedury .
  4. Adaptér ( anglicky  adapter ) - přizpůsobení komponent pro poskytování jiného rozhraní.
  5. Funkční objekt ( anglicky  functor ) - skrytí funkce v objektu pro použití jinými komponentami.

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

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í

Iterátory

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í.

Viz také

Poznámky

  1. std::vektor . Datum přístupu: 14. února 2016. Archivováno z originálu 27. listopadu 2015.
  2. std:list
  3. std::deque . Získáno 14. února 2016. Archivováno z originálu 5. února 2016.
  4. Syntaxe ukazatelů v C++ . Získáno 14. února 2016. Archivováno z originálu 11. března 2016.
  5. Knihovna iterátoru (downlink) . Získáno 14. února 2016. Archivováno z originálu 5. února 2016. 
  6. Koncepty C++: Iterátor . Získáno 14. února 2016. Archivováno z originálu 19. února 2016.
  7. Typy iterátorů : Výstup vs. vstup vs. dopředu vs. Iterátor náhodného přístupu . Získáno 14. února 2016. Archivováno z originálu 23. února 2016.

Odkazy

Literatura