Standardní knihovna C++ je kolekce tříd a funkcí pro programovací jazyk C++ napsaných v C++, která je součástí ISO normy jazyka C++.ISO/IEC 14882:2003(E) Programming Languages – C++ §17-27
Úvod Standardní knihovna C++ poskytuje různé obecné kontejnery, funkce pro jejich použití a manipulaci s nimi, funkční objekty, obecné řetězce a proudy (včetně interaktivních a souborových vstupů a výstupů), podporu některých vlastností jazyka a funkce pro běžné úlohy např. výpočet druhé odmocniny čísla. Standardní knihovna C++ také obsahuje většinu hlavičkových souborů standardní knihovny jazyka ISO C s příponou .h, ale jejich použití nebylo doporučované (toto nedoporučování bylo zrušeno v C++23).ISO/IEC 14882:2003(E) Programming Languages – C++ §D.5 C++23 naopak považuje tyto hlavičkové soubory za užitečné pro interoperabilitu s jazykem C, ale nedoporučuje jejich použití mimo programy, které mají být platnými programy v jazyce C i C++. Žádné jiné hlavičkové soubory ve Standardní knihovně C++ nemají příponu .h. Prvky Standardní knihovny C++ jsou deklarovány ve jmenném prostoru std.
Standardní knihovna C++ používá konvence, které zavedla Standard Template Library (STL), a byla ovlivněna výzkumy v oblasti generického programování a vývojáři STL, jako je Alexander Stepanov a Meng Lee. Přestože Standardní knihovna C++ a STL sdílejí mnoho vlastností, ani jedna není vlastní nadmnožinou druhé.
Významným rysem Standardní knihovny C++ je, že nejen udává syntaxi a sémantiku obecných algoritmů, ale také klade požadavky na jejich výkonnost."Generic Algorithms", David Musser Tyto výkonnostní požadavky často odpovídají dobře známému algoritmu, jehož použití se očekává, ale nevyžaduje. V mnoha případech je vyžadován lineární čas O(n) nebo lineárně logaritmický čas O(n log n), ale v některých případech je povolena vyšší složitost, např. kvazilineární čas O(n log2 n) pro stabilní třídění (aby bylo možné stabilní třídění slučováním na místě). Dříve se vyžadovalo, aby třídění mělo v průměrném případě složitost nejvýše O(n log n), což umožňovalo použít rychlého řazení, který je v praxi rychlé, ale má špatnou výkonnost v nejhorším případě, ale byl zaveden Introsort, který poskytuje jak velkou výkonnost v průměrném případě, tak optimální složitost v nejhorším případě, a od jeho implementace v C++11 je zaručeno, že třídění bude přinejhorším lineárně logaritmické. V jiný případech zůstávají požadavky volnější, např. u algoritmu výběru, u něhož se vyžaduje pouze lineární složitost v průměrném případě (kterou má quickselect), nikoli lineární složitost v nejhorším případě, jakou má introselect.
Standardní knihovna C++ prošla první ISO standardizací v rámci standardizačního úsilí ISO zaměřeného na jazyk C++ v 90. letech 20. století. Od roku 2011 je rozšiřována a aktualizována každé tři roky"C++ IS Schedule", Herb Sutter s každou revizí normy C++.
Implementace Jméno Organizace Homepage Zkratka Licence Nejnovější vydání GNU C++ Standard Library Projekt GNU a Free Software Foundation libstdc++ GPLv3 s GCC Runtime Library Exception Nové hlavní vydání jednou za rok LLVM C++ Standard Library LLVM Developer Group libc++ Apache Licence 2.0 s LLVM výjimkami Každé 2 týdny NVIDIA C++ Standard Library NVIDIA libcudacxx Apache Licence 2.0 s LLVM výjimkami Microsoft C++ Standard Library Microsoft MSVC STL Apache Licence 2.0 s LLVM výjimkami Denně HPX C++ Standard Library for Paralelism and Concurrency STELLAR Group Boost Software Licence 1.0 Elektronic Arts Standard Template Library Electronic Arts EASTL BSD 3-Clause License Dinkum C++ Library Dinkumware Neznámá Komerční Není známo Cray C++ Standard Library Cray User Group Neznámá Komerční Není známo
Nevyvíjená
Apache Standardní Knihovna C++ Další implementací s otevřeným zdrojovým textem je Standardní knihovna Apache C++. Původně ji komerčně vyvíjela firma Rogue Wave Software, která ji později věnovala nadaci Apache Software Foundation.Apache C++ Standard Library Po více než pět letech bez vydání se však správní rada Apache Software Foundation rozhodla projekt ukončit a přesunout jej do projektu Apache Attic. Následující knihovny implementují větší část Standardní knihovny C++: Jméno Homepage Popis Abseil Kolekce knihoven s otevřeným zdrojovým textem používaná interně společností Google Folly Množství C++14 knihoven používaných společností Facebook Bareflank Support Library C++ knihovna, v níž lze vše provádět v době překladu
Standardní moduly Moduly byly zavedeny v C++20, ale jejich podpora ve Standardní knihovně neexistovala až do verze C++23. Tyto pojmenované moduly byly přidány tak, aby zahrnovaly všechny položky deklarované v globálním jmenném prostoru i ve jmenném prostoru std, které jsou poskytované importovatelnými standardními hlavičkovými soubory. Makra nesmějí být exportovatelná, takže uživatelé musí ručně vkládat nebo importovat hlavičkové soubory, které emitují makra pro použití.
Exportuje všechny deklarace ve jmenném prostoru std a globální funkce pro přidělování a uvolňování paměti, které jsou k dispozici v importovatelných hlavičkách C++ knihovny obsahujících nástroje z libc (i když jsou deklarovány ve standardním jmenném prostoru). Exportuje stejné deklarace jako pojmenovaný modul std, a navíc exportuje funkce v globálním jmenném prostoru v libc nástrojích.
Standardní hlavičkové soubory Následující hlavičkové soubory obsahují deklarace Standardní knihovny C++.
Obecné Od verze C++17. Definuje typově bezpečnou třídu std::any, která podobně jako void * plní úlohu libovolného typu.
Od verze C++11. Poskytuje šablonu třídy std::atomic, několik jejích šablonových specializací a další atomické operace. Poskytuje časové prvky, např. std::chrono::duration, std::chrono::time_point a hodiny. Od verze C++20 bylo přidáno velké množství časových vlastností: kalendaře, časové zóny, další hodiny a formátování řetězců s časovými údaji. Od verze C++20. Poskytuje základní knihovnu konceptů. Od verze C++23. Poskytuje šablonu třídy std::expected, výsledkový typ navržený pro rozlišení, zda funkce skončila normálně (a vrácení hodnoty) nebo chybou. Poskytuje několik funkčních objektů navržených pro použití se standardními algoritmy. Od verze C++23. Poskytuje generátor korutin, který navíc podporuje vnořené yield operace nad rozsahy. Poskytuje nástroje pro správu paměti v C++ včetně šablony třídy std::unique_ptr. Od verze C++17. Poskytuje nástroje pro vytváření polymofních alokátorů paměti, jejichž chování se může měnit za běhu. Od verze C++17. Poskytuje šablonu třídy nepovinného typu std::optional, která rozšíří libovolný typ o prázdnou (neexistující, nedefinovanou) hodnotu std::nullopt. Od verze C++11. Poskytuje std::scoped_allocator_adaptor. Od verze C++23. Poskytuje operace sledování zásobníku. Obsahuje standardní třídy výjimek, např. std::logic_error a std::runtime_error odvozené od std::exception. Od verze C++11. Definuje std::error_code Od verze C++11 a TR1. Poskytuje šablonu třídy std::tuple pro uspořádané n-tice. Od verze C++11. Poskytuje nástroje pro práci s typy při metaprogramování. Poskytuje různé nástroje: šablonu třídy std::pair (uspořádané dvojice), posloupnosti celých čísel použitelné v době překladu, pomocníky při konstrukci slovníkových typů, funkce jako std::move a std::forward a mnohé další. Jmenný prostor std::rel_ops pro automatické generování operátorů porovnání je v C++20 nedoporučovaný a místo něj by se měly používat nové výchozí operátory porovnání. Od verze C++17. Šablona třídy std::variant pro vytváření variantních záznamů (unionů) s rozlišovací položkou.
Jazyková podpora Od verze C++20. Poskytuje podporu operátor trojcestného porovnání. Od verze C++20. Poskytuje podporu koprogramů. Poskytuje několik typů a funkcí pro práci s výjimkami, včetně bázové třídy std::exception všech výjimek, které vyhazuje standardní knihovna. Od verze C++11. Poskytuje podporu inicializačních seznamů. Poskytuje šablonu třídy std::numeric_limits popisující vlastnosti základních numerických typů. Poskytuje operátory new a delete a jiné funkce a typy tvořící základy správy paměti v C++. Od verze C++20. Poskytuje zachycení informací o místě ve zdrojovém kódu alternativní k předdefinovaným makrům např. __LINE__. Od verze C++23. Poskytuje podmíněnou podpory pro rozšířené typy s pohyblivou řádovou čárkou. Poskytuje nástroje pro práci s C++ RTTI. Od verze C++20. Poskytuje informace o implementaci Standardní knihovny C++.
Kontejnery Od verze C++11 a TR1. Poskytuje šablonu kontejnerové třídy std::array, kontejner pro pole pevné velikosti. Poskytuje specializovanou kontejnerovou třídu std::bitset pro bitové pole. Poskytuje šablonu kontejnerové třídy std::deque, fronta s přístupem na obou koncích. Od verze C++23. Poskytuje šablony tříd adaptérů kontejneru std::flat_map a std::flat_multimap. Od verze C++23. Poskytuje šablony tříd adaptérů kontejneru std::flat_set a std::flat_multiset. Od verze C++11 a TR1. Poskytuje šablonu kontejnerové třídy std::forward_list, jednoduchý spojový seznam. Poskytuje šablonu kontejnerové třídy std::list, obousměrný spojový seznam. Poskytuje šablonu kontejnerové třídy std::map a std::multimap, setříděné asociativní pole a multimap. Od verze C++23. Poskytuje šablonu třídy std::mdspan podobné std::span, ale s vícerozměrným pohledem. Poskytuje třídy adaptéru kontejneru std::queue, frontu s jedním koncem, a std::priority_queue prioritní frontu. Poskytuje šablonu kontejnerové třídy std::set a std::multiset, setříděné asociativní kontejnery nebo množiny. Od verze C++20. Poskytuje šablonu třídy std::span, nevlastnící pohled, které se vztahuje na libovolný souvislý rozsah. Poskytuje kontejnerovou třídu adaptéru std::stack, zásobník. Od verze C++11 a TR1. Poskytuje kontejnerovou šablonu třídy std::unordered map a std::unordered_multimap, hašovací tabulky. Od verze C++11 a TR1. Poskytuje kontejnerovou šablonu třídy std::unordered_set a std::unordered_multiset. Poskytuje šablonu třídy kontejneru std::vector, dynamické pole.
Iterátory a rozsahy Poskytuje definice mnoha algoritmů pro použití s kontejnery a rozsahy. Od verze C++17. Poskytuje prováděcí pravidla pro paralelizované algoritmy. Poskytuje třídy a šablony pro práci s iterátory. Zobecněné numerické algoritmy. Od verze C++20. Poskytuje nástroje pro práci s rozsahy a adaptéry pro odložené vyhodnocování.
Localizace Poskytuje konverze pro různá kódování znaků. Tento hlavičkový soubor je nedoporučovaný od C++17. Definuje třídy a deklaruje funkce, které zapouzdřují informace pro národní zvyklosti a manipulují s nimi. Od verze C++26. Poskytuje identifikaci kódování textu.
Řetězce Od verze C++17. Poskytuje konverze celých čísel a čísel s pohyblivou řádovou čárkou na řetězce a zpátky nezávislé na národních zvyklostech, neprovádějící alokace, a nevyhazující výjimky. Od verze C++20. Poskytuje moderní způsob formátování řetězců včetně std::format. Poskytuje třídy a šablony pro práci se znakovými řetězci. Od verze C++17. Poskytuje šablonu třídy std::basic_string_view, neměnný a nevlastnící pohled na libovolný řetězec. Od verze C++11. Poskytuje programy pro vyhledávání vzorků v řetězci pomocí regulárních výrazů.
Proudy, soubory a vstup/výstup Od verze C++17. Poskytuje nástroje pro operace pro Souborový systém a jeho komponenty. Poskytuje nástroje pro vstup ze souboru a výstup do souboru. Viz fstream. Poskytuje nástroje pro nastavení výstupního formátování, např. báze používaný při formátování celého čísla a přesnost hodnot v pohyblivé řádové čárce. Poskytuje několik typů a funkcí pro základní operace s iostreams. Poskytuje dopředné deklarace několika šablon tříd pro vstupy a výstupy. Poskytuje základní operace pro vstupy a výstupy pro C++. Viz iostream. Poskytuje std::istream a další třídy pro vstup. Poskytuje std::ostream a další třídy pro výstup. Od verze C++23. Poskytuje formátovaný výstup, např. std::print podporované pro C i C++ proudy.