Přeskočit na obsah

Standardní knihovna C++

Z Wikipedie, otevřené encyklopedie

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]

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; před 114 dny
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; před 212 dny
Elektronic Arts Standard Template Library Electronic Arts [6] EASTL BSD 3-Clause License 31. srpna 2024; před 118 dny
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++.

<any>
Od verze C++17. Definuje typově bezpečnou třídu std::any, která podobně jako void * 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) hodnotu std::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 a std::runtime_error odvozené od std::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 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í.
<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 a delete 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 a std::flat_multimap.
<flat_set>
Od verze C++23. Poskytuje šablony tříd adaptérů kontejneru std::flat_set a std::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 a std::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, a std::priority_queue prioritní frontu.
<set>
Poskytuje šablonu kontejnerové třídy std::set a std::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 a std::unordered_multimap, hašovací tabulky.
<unordered_set>
Od verze C++11 a TR1. Poskytuje kontejnerovou šablonu třídy std::unordered_set a std::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.
<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, a std::indirect_array), dvě třídy (std::slice a std::gslice), a řadu šablon funkcí pro reprezentaci a manipulaci s poli hodnot.

Standardní knihovna jazyka C

[editovat | editovat zdroj]
Podrobnější informace naleznete v článku 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.

V tomto článku byl použit překlad textu z článku C++ Standard Library na anglické Wikipedii.

  1. ISO/IEC 14882:2003(E) Programming Languages – C++ §17-27
  2. Thomas Köppe. Clarifying the status of the "C headers" [online]. 2021-06-11. Dostupné online. 
  3. ISO/IEC 14882:2003(E) Programming Languages – C++ §D.5
  4. Bjarne Stroustrup, 1994. The Design and Evolution of C++ §8.5. [s.l.]: Addison Wesley. Dostupné online. ISBN 0-201-54330-3. 
  5. 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. 
  6. "Generic Algorithms", David Musser
  7. std::nth_element [online]. cppreference.com [cit. 2018-03-20]. Dostupné online. 
  8. "C++ IS Schedule", Herb Sutter
  9. Apache C++ Standard Library
  10. Brett Porter. Apache C++ Standard Library and the Attic [online]. stdcxx-dev mailing list, 2013-07-18 [cit. 2014-02-27]. Dostupné online. 
  11. VARLI, Cengizhan. What is std::any in C++? [online]. [cit. 2024-08-21]. Dostupné online. 
  12. FILIPEK, Bartlomiej. Polymorphic Allocators, std::vector Growth and Hacking [online]. [cit. 2021-04-30]. Dostupné online. (anglicky) 
  13. 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]

Související články

[editovat | editovat zdroj]

Externí odkazy

[editovat | editovat zdroj]