Standardní knihovna C++
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++.[1]
Ú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[2]).[3] 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.[4][5] Přestože Standardní knihovna C++ a STL sdílejí mnoho vlastností, ani jedna není vlastní nadmnožinou druhé.[zdroj?]
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.[6] 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),[7] 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[8] 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 | [1] | libstdc++ | GPLv3 s GCC Runtime Library Exception | Nové hlavní vydání jednou za rok |
| LLVM C++ Standard Library | LLVM Developer Group | [2] | libc++ | Apache Licence 2.0 s LLVM výjimkami | Každé 2 týdny |
| NVIDIA C++ Standard Library | NVIDIA | [3] | libcudacxx | Apache Licence 2.0 s LLVM výjimkami | 4. září 2024 |
| Microsoft C++ Standard Library | Microsoft | [4] | MSVC STL | Apache Licence 2.0 s LLVM výjimkami | Denně |
| HPX C++ Standard Library for Paralelism and Concurrency | STELLAR Group | [5] | Boost Software Licence 1.0 | 29. května 2024 | |
| Elektronic Arts Standard Template Library | Electronic Arts | [6] | EASTL | BSD 3-Clause License | 31. srpna 2024 |
| Dinkum C++ Library | Dinkumware | [7] Archivováno 11. 2. 2021 na Wayback Machine. | Neznámá | Komerční | Není známo |
| Cray C++ Standard Library | Cray User Group | [8] | 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.[9] 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.[10] Následující knihovny implementují větší část Standardní knihovny C++:
| Jméno | Homepage | Popis |
|---|---|---|
| Abseil | [9] | Kolekce knihoven s otevřeným zdrojovým textem používaná interně společností Google |
| Folly | [10] | Množství C++14 knihoven používaných společností Facebook |
| Bareflank Support Library | [11] | 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í.
std- Exportuje všechny deklarace ve jmenném prostoru
stda 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). std.compat- 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é
<any>- Od verze C++17. Definuje typově bezpečnou třídu
std::any, která podobně jakovoid *plní úlohu libovolného typu.[11]
<atomic>- Od verze C++11. Poskytuje šablonu třídy
std::atomic, několik jejích šablonových specializací a další atomické operace. <chrono>- Poskytuje časové prvky, např.
std::chrono::duration,std::chrono::time_pointa 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. <concepts>- Od verze C++20. Poskytuje základní knihovnu konceptů.
<expected>- 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. <functional>- Poskytuje několik funkčních objektů navržených pro použití se standardními algoritmy.
<generator>- Od verze C++23. Poskytuje generátor korutin, který navíc podporuje vnořené yield operace nad rozsahy.
<memory>- Poskytuje nástroje pro správu paměti v C++ včetně šablony třídy
std::unique_ptr. <memory_resource>- 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.[12]
<optional>- Od verze C++17. Poskytuje šablonu třídy nepovinného typu
std::optional, která rozšíří libovolný typ o prázdnou (neexistující, nedefinovanou) hodnotustd::nullopt. <scoped_allocator>- Od verze C++11. Poskytuje
std::scoped_allocator_adaptor. <stacktrace>- Od verze C++23. Poskytuje operace sledování zásobníku.
<stdexcept>- Obsahuje standardní třídy výjimek, např.
std::logic_errorastd::runtime_errorodvozené odstd::exception. <system_error>- Od verze C++11. Definuje
std::error_code <tuple>- Od verze C++11 a TR1. Poskytuje šablonu třídy
std::tuplepro uspořádané n-tice. <type_traits>- Od verze C++11. Poskytuje nástroje pro práci s typy při metaprogramování.
<utility>- 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 jakostd::moveastd::forwarda mnohé další. Jmenný prostorstd::rel_opspro 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í. <variant>- Od verze C++17. Šablona třídy
std::variantpro vytváření variantních záznamů (unionů) s rozlišovací položkou.
Jazyková podpora
<compare>- Od verze C++20. Poskytuje podporu operátor trojcestného porovnání.
<coroutine>- Od verze C++20. Poskytuje podporu koprogramů.
<exception>- Poskytuje několik typů a funkcí pro práci s výjimkami, včetně bázové třídy
std::exceptionvšech výjimek, které vyhazuje standardní knihovna. <initializer_list>- Od verze C++11. Poskytuje podporu inicializačních seznamů.
<limits>- Poskytuje šablonu třídy
std::numeric_limitspopisující vlastnosti základních numerických typů. <new>- Poskytuje operátory
newadeletea jiné funkce a typy tvořící základy správy paměti v C++. <source_location>- Od verze C++20. Poskytuje zachycení informací o místě ve zdrojovém kódu alternativní k předdefinovaným makrům např.
__LINE__. <stdfloat>- Od verze C++23. Poskytuje podmíněnou podpory pro rozšířené typy s pohyblivou řádovou čárkou.
<typeinfo>- Poskytuje nástroje pro práci s C++ RTTI.
<version>- Od verze C++20. Poskytuje informace o implementaci Standardní knihovny C++.[13]
Kontejnery
<array>- Od verze C++11 a TR1. Poskytuje šablonu kontejnerové třídy
std::array, kontejner pro pole pevné velikosti. <bitset>- Poskytuje specializovanou kontejnerovou třídu
std::bitsetpro bitové pole. <deque>- Poskytuje šablonu kontejnerové třídy
std::deque, fronta s přístupem na obou koncích. <flat_map>- Od verze C++23. Poskytuje šablony tříd adaptérů kontejneru
std::flat_mapastd::flat_multimap. <flat_set>- Od verze C++23. Poskytuje šablony tříd adaptérů kontejneru
std::flat_setastd::flat_multiset. <forward_list>- Od verze C++11 a TR1. Poskytuje šablonu kontejnerové třídy
std::forward_list, jednoduchý spojový seznam. <list>- Poskytuje šablonu kontejnerové třídy
std::list, obousměrný spojový seznam. <map>- Poskytuje šablonu kontejnerové třídy
std::mapastd::multimap, setříděné asociativní pole a multimap. <mdspan>- Od verze C++23. Poskytuje šablonu třídy
std::mdspanpodobnéstd::span, ale s vícerozměrným pohledem. <queue>- Poskytuje třídy adaptéru kontejneru
std::queue, frontu s jedním koncem, astd::priority_queueprioritní frontu. <set>- Poskytuje šablonu kontejnerové třídy
std::setastd::multiset, setříděné asociativní kontejnery nebo množiny. <span>- Od verze C++20. Poskytuje šablonu třídy
std::span, nevlastnící pohled, které se vztahuje na libovolný souvislý rozsah. <stack>- Poskytuje kontejnerovou třídu adaptéru
std::stack, zásobník. <unordered_map>- Od verze C++11 a TR1. Poskytuje kontejnerovou šablonu třídy
std::unordered mapastd::unordered_multimap, hašovací tabulky. <unordered_set>- Od verze C++11 a TR1. Poskytuje kontejnerovou šablonu třídy
std::unordered_setastd::unordered_multiset. <vector>- Poskytuje šablonu třídy kontejneru
std::vector, dynamické pole.
Iterátory a rozsahy
<algorithm>- Poskytuje definice mnoha algoritmů pro použití s kontejnery a rozsahy.
<execution>- Od verze C++17. Poskytuje prováděcí pravidla pro paralelizované algoritmy.
<iterator>- Poskytuje třídy a šablony pro práci s iterátory.
<numeric>- Zobecněné numerické algoritmy.
<ranges>- Od verze C++20. Poskytuje nástroje pro práci s rozsahy a adaptéry pro odložené vyhodnocování.
Localizace
<codecvt>- Poskytuje konverze pro různá kódování znaků. Tento hlavičkový soubor je nedoporučovaný od C++17.
<locale>- Definuje třídy a deklaruje funkce, které zapouzdřují informace pro národní zvyklosti a manipulují s nimi.
<text_encoding>- Od verze C++26. Poskytuje identifikaci kódování textu.
Řetězce
<charconv>- 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.
<format>- Od verze C++20. Poskytuje moderní způsob formátování řetězců včetně
std::format. <string>- Poskytuje třídy a šablony pro práci se znakovými řetězci.
<string_view>- Od verze C++17. Poskytuje šablonu třídy
std::basic_string_view, neměnný a nevlastnící pohled na libovolný řetězec. <regex>- 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
<filesystem>- Od verze C++17. Poskytuje nástroje pro operace pro Souborový systém a jeho komponenty.
<fstream>- Poskytuje nástroje pro vstup ze souboru a výstup do souboru. Viz fstream.
<iomanip>- 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.
<ios>- Poskytuje několik typů a funkcí pro základní operace s iostreams.
<iosfwd>- Poskytuje dopředné deklarace několika šablon tříd pro vstupy a výstupy.
<iostream>- Poskytuje základní operace pro vstupy a výstupy pro C++. Viz iostream.
<istream>- Poskytuje
std::istreama další třídy pro vstup. <ostream>- Poskytuje
std::ostreama další třídy pro výstup. <print>- Od verze C++23. Poskytuje formátovaný výstup, např.
std::printpodporované pro C i C++ proudy. <spanstream>- Od verze C++23. Poskytuje
std::spanstreama jiné V/V proudy s pevným znakovým bufferem. <sstream>- Poskytuje
std::stringstreama další pomocné třídy pro manipulace s řetězci. <streambuf>- Poskytuje funkčnost čtení a zapisování na nebo z určitých typů znakových posloupností, např. externích souborů nebo řetězců.
<syncstream>- Od verze C++20. Poskytuje
std::osyncstreama další třídy pro podporu synchronizovaných výstupních proudů.
Knihovna podpory vláken
<barrier>- Od verze C++20. Poskytuje znovupoužitelnou vláknovou bariéru
std::barrier. <condition_variable>- Od verze C++11. V 32.6-1, podmínkové proměnné poskytují synchronizační primitiva používaná pro blokování vlákna dokud některé jiné vlákno neinformuje, že byla splněna určitá podmínka nebo dokud nebyl dosažen určitý systémový čas.
<future>- Od verze C++11. V 32.9.1-1 jsou popisovány komponenty, které může program v C++ používat v jednom vlákně pro načítání výsledků (hodnot nebo výjimek) z funkce, které běžela ve stejném nebo jiném vlákně.
<hazard_pointer>- Od verze C++26. Poskytuje
std::hazard_pointer. <latch>- Od verze C++20. Poskytuje vláknovou bariéru
std::latchpro jedno použití. <mutex>- Od verze C++11. V 32.5-1 tato část poskytuje mechanismy pro vzájemné vyloučení: mutexy, zámky, a volání jednou.
<rcu>- Od verze C++26. Poskytuje mechanismy read-copy-update.
<shared_mutex>- Od verze C++14. Poskytuje nástroje pro sdílené vzájemné vyloučení.
<semaphore>- Od verze C++20. Poskytuje semafor, který modeluje nezáporný čítač prostředků.
<stop_token>- Od verze C++20. V 32.3.1-1, tato část popisuje komponenty, které lze používat pro asynchronní požadavky, které včas zastaví provádění operace, typicky protože výsledek již není požadován. Takový požadavek se nazývá požadavek na zastavení.
<thread>- Od verze C++11. Poskytuje třídu a jmenný prostor pro práci s vlákny.
Numerická knihovna
Komponenty, které mohou programy v C++ používat pro seminumerické operace.
<bit>- Od verze C++20. Poskytuje nástroje pro bitové manipulace.
<complex>- Definuje šablonu třídy
std::complexa mnoho funkcí pro reprezentaci komplexních čísel a manipulaci s nimi. <numbers>- Od verze C++20. Poskytuje matematické konstanty definované ve jmenném prostoru
std::numbers. <random>- Od verze C++11. Nástroje pro generování (pseudo-)náhodných čísel s různými distribucemi (rozděleními).
<ratio>- Od verze C++11. Poskytuje v době překladu racionální aritmetiku založenou na šablonách tříd.
<valarray>- Definuje pět šablon tříd (
std::valarray,std::slice_array,std::gslice_array,std::mask_array, astd::indirect_array), dvě třídy (std::sliceastd::gslice), a řadu šablon funkcí pro reprezentaci a manipulaci s poli hodnot.
Standardní knihovna jazyka C
Každý hlavičkový soubor ze Standardní knihovny jazyka C je obsažen ve Standardní knihovně C++ pod jiným jménem, získaným odstraněním .h a přidáním c na začátek jména; například z time.h se stane ctime. Jediným rozdílem mezi těmito hlavičkovými soubory a hlavičkovými soubory tradiční Standardní knihovny jazyka C je, že pokud je to možné, jsou funkce umístěny do jmenného prostoru std::. V ISO C mohou být funkce ve standardní knihovně implementovány makry jazyka C, což v ISO C++ není dovoleno.
Odkazy
Reference
V tomto článku byl použit překlad textu z článku C++ Standard Library na anglické Wikipedii.
- ↑ ISO/IEC 14882:2003(E) Programming Languages – C++ §17-27
- ↑ Thomas Köppe. Clarifying the status of the "C headers" [online]. 2021-06-11. Dostupné online.
- ↑ ISO/IEC 14882:2003(E) Programming Languages – C++ §D.5
- ↑ Bjarne Stroustrup, 1994. The Design and Evolution of C++ §8.5. [s.l.]: Addison Wesley. Dostupné online. ISBN 0-201-54330-3.
- ↑ Alexander Stepanov, Meng Lee. The Standard Template Library [online]. HP Labs, 1994-08-01 [cit. 2017-10-22]. Dostupné v archivu pořízeném dne 1997-11-09.
- ↑ "Generic Algorithms", David Musser
- ↑ std::nth_element [online]. cppreference.com [cit. 2018-03-20]. Dostupné online.
- ↑ "C++ IS Schedule", Herb Sutter
- ↑ Apache C++ Standard Library
- ↑ Brett Porter. Apache C++ Standard Library and the Attic [online]. stdcxx-dev mailing list, 2013-07-18 [cit. 2014-02-27]. Dostupné online.
- ↑ VARLI, Cengizhan. What is std::any in C++? [online]. [cit. 2024-08-21]. Dostupné online.
- ↑ FILIPEK, Bartlomiej. Polymorphic Allocators, std::vector Growth and Hacking [online]. [cit. 2021-04-30]. Dostupné online. (anglicky)
- ↑ Working Draft, Standard for Programming Language C++ [online]. ISO/IEC, 2020-04-01 [cit. 2021-04-30]. S. 492. Dostupné v archivu pořízeném z originálu dne 2020-04-27.
Literatura
- STROUSTRUP, Bjarne, 2013. The C++ Programming Language. [s.l.]: Addison-Wesley. ISBN 978-0321563842.
- JOSUTTIS, Nicolai, 2012. The C++ Standard Library – A Tutorial and Reference. [s.l.]: Addison-Wesley. Dostupné online. ISBN 978-0-321-62321-8.
- VAN WEERT, Peter; GREGOIRE, Marc. C++ Standard Library Quick Reference. [s.l.]: Apress, 2016-06-14. Dostupné v archivu pořízeném dne 2021-05-16. ISBN 978-1484218754. Archivováno 16. 5. 2021 na Wayback Machine.
Související články
- Boost (C++ knihovny)
- C POSIX knihovna
- Standardní knihovna jazyka C
- Standardní knihovna
- C++ Technická zpráva 1
Externí odkazy
- C++ Standard Library reference
- Microsoft C++ Standard Library Reference
- Rogue Wave SourcePro C++ documentation
- Apache C++ Standard Library Wiki, vývoj ukončen 15. května 2014 (vycházející z Rogue Wave C++ Standard Library 4.1.0)
- STLport C++ Standard Library documentation
- The GNU C++ Library online documentation
- LLVM/Clang C++ Standard Library documentation