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
[editovat | editovat zdroj]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
[editovat | editovat zdroj]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á
[editovat | editovat zdroj]Apache Standardní Knihovna C++
[editovat | editovat zdroj]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
[editovat | editovat zdroj]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
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). 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
[editovat | editovat zdroj]Následující hlavičkové soubory obsahují deklarace Standardní knihovny C++.
Obecné
[editovat | editovat zdroj]<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_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. <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_error
astd::runtime_error
odvozené odstd::exception
. <system_error>
- Od verze C++11. Definuje
std::error_code
<tuple>
- Od verze C++11 a TR1. Poskytuje šablonu třídy
std::tuple
pro 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::move
astd::forward
a mnohé další. Jmenný prostorstd::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í. <variant>
- Od verze C++17. Šablona třídy
std::variant
pro vytváření variantních záznamů (unionů) s rozlišovací položkou.
Jazyková podpora
[editovat | editovat zdroj]<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::exception
vš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_limits
popisující vlastnosti základních numerických typů. <new>
- Poskytuje operátory
new
adelete
a 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
[editovat | editovat zdroj]<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::bitset
pro 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_map
astd::flat_multimap
. <flat_set>
- Od verze C++23. Poskytuje šablony tříd adaptérů kontejneru
std::flat_set
astd::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::map
astd::multimap
, setříděné asociativní pole a multimap. <mdspan>
- Od verze C++23. Poskytuje šablonu třídy
std::mdspan
podobné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_queue
prioritní frontu. <set>
- Poskytuje šablonu kontejnerové třídy
std::set
astd::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 map
astd::unordered_multimap
, hašovací tabulky. <unordered_set>
- Od verze C++11 a TR1. Poskytuje kontejnerovou šablonu třídy
std::unordered_set
astd::unordered_multiset
. <vector>
- Poskytuje šablonu třídy kontejneru
std::vector
, dynamické pole.
Iterátory a rozsahy
[editovat | editovat zdroj]<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
[editovat | editovat zdroj]<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
[editovat | editovat zdroj]<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
[editovat | editovat zdroj]<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::istream
a další třídy pro vstup. <ostream>
- Poskytuje
std::ostream
a další třídy pro výstup. <print>
- Od verze C++23. Poskytuje formátovaný výstup, např.
std::print
podporované pro C i C++ proudy. <spanstream>
- Od verze C++23. Poskytuje
std::spanstream
a jiné V/V proudy s pevným znakovým bufferem. <sstream>
- Poskytuje
std::stringstream
a 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::osyncstream
a další třídy pro podporu synchronizovaných výstupních proudů.
Knihovna podpory vláken
[editovat | editovat zdroj]<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::latch
pro 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
[editovat | editovat zdroj]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::complex
a 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::slice
astd::gslice
), a řadu šablon funkcí pro reprezentaci a manipulaci s poli hodnot.
Standardní knihovna jazyka C
[editovat | editovat zdroj]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
[editovat | editovat zdroj]Reference
[editovat | editovat zdroj]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
[editovat | editovat zdroj]- 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
[editovat | editovat zdroj]- Boost (C++ knihovny)
- C POSIX knihovna
- Standardní knihovna jazyka C
- Standardní knihovna
- C++ Technická zpráva 1
Externí odkazy
[editovat | editovat zdroj]- 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