Articulo de referencia

Biblioteca estándar de C++

En el lenguaje de programación C++ , la biblioteca estándar de C++ es una colección de clases y funciones , que están escritas en el lenguaje base y forman parte del propio está...

En el lenguaje de programación C++ , la biblioteca estándar de C++ es una colección de clases y funciones , que están escritas en el lenguaje base y forman parte del propio estándar ISO de C++ . [ 1 ]

Descripción general

La biblioteca estándar de C++ proporciona varios contenedores genéricos, funciones para usar y manipular estos contenedores, objetos de función, cadenas y flujos genéricos (incluidas E/S interactivas y de archivos), soporte para algunas características del lenguaje y funciones para tareas comunes como encontrar la raíz cuadrada de un número. La biblioteca estándar de C++ también incorpora la mayoría de los encabezados de la biblioteca estándar ISO C que terminan en " .h ", pero su uso fue descontinuado (se revirtió la descontinuación desde C++23 [ 2 ] ). [ 3 ] C++23 considera que estos encabezados son útiles para la interoperabilidad con C y recomienda no usarlos fuera de programas que estén destinados a ser programas válidos tanto en C como en C++. Ningún otro encabezado en la biblioteca estándar de C++ termina en " .h ". Las características de la biblioteca estándar de C++ se declaran dentro del espacio de nombres .std

La biblioteca estándar de C++ se basa en las convenciones introducidas por la biblioteca de plantillas estándar (STL) y ha sido influenciada por la investigación en programación genérica y por desarrolladores de la STL como Alexander Stepanov y Meng Lee. [ 4 ] [ 5 ] Aunque la biblioteca estándar de C++ y la STL comparten muchas características, ninguna es un superconjunto estricto de la otra. El diseño de la biblioteca estándar de C++, al igual que la biblioteca estándar de C, es minimalista y contiene solo las características básicas para la programación, careciendo de la mayoría de las características más especializadas que ofrecen las bibliotecas estándar de Java o C# . Para obtener más características, se pueden usar algunas bibliotecas de terceros, como las bibliotecas Boost y las bibliotecas POCO C++ , que ofrecen características adicionales, para complementar la biblioteca estándar. Una implementación para un encabezado de la biblioteca estándar de C++ se describe como "independiente" si la ejecución del programa no depende de un sistema operativo.

A noteworthy feature of the C++ Standard Library is that it not only specifies the syntax and semantics of generic algorithms, but also places requirements on their performance.[6] These performance requirements often correspond to a well-known algorithm, which is expected but not required to be used. In most cases this requires linear time O(n){\displaystyle O(n)} or linearithmic timeO(nlog(n)){\displaystyle O(n\log(n))}, but in some cases higher bounds are allowed, such as quasilinear timeO(nlog2(n)){\displaystyle O(n\log ^{2}(n))} for stable sort (to allow in-placemerge sort). Previously, sorting was only required to take O(nlog(n)){\displaystyle O(n\log(n))} on average, allowing the use of quicksort, which is fast in practice but has poor worst-case performance, but introsort was introduced to allow both fast average performance and optimal worst-case complexity, and as of C++11, sorting is guaranteed to be at worst linearithmic. In other cases requirements remain laxer, such as selection, which is only required to be linear on average (as in quickselect),[7] not requiring worst-case linear as in introselect.

The C++ Standard Library underwent ISO standardization as part of the C++ ISO Standardization effort in the 1990s. Since 2011, it has been expanded and updated every three years[8] with each revision of the C++ standard.

C++20 specifies the introduction of standard library header units,[9] and C++23 adds full module support for the standard library.[10]

Implementations

Discontinued

Apache C++ Standard Library

La biblioteca estándar de Apache C++ es otra implementación de código abierto. Fue desarrollada originalmente con fines comerciales por Rogue Wave Software y posteriormente donada a la Apache Software Foundation . [ 11 ] Sin embargo, tras más de cinco años sin una nueva versión, la junta directiva de la Apache Software Foundation decidió finalizar este proyecto y trasladarlo a Apache Attic. [ 12 ]

Véase también

Las siguientes bibliotecas implementan gran parte de la biblioteca estándar de C++:

Organización del espacio de nombres

La biblioteca estándar de C++ se encuentra dentro del stdespacio de nombres. stdHistóricamente, era un espacio de nombres plano (a diferencia de otros lenguajes como Java y C#, que dividen extensamente sus respectivas bibliotecas estándar según líneas nomenclaturales y jerárquicas), pero desde C++11 se ha dividido aún más en subespacios de nombres dentro del mismo:

  • std(el espacio de nombres principal de la biblioteca estándar) [ 13 ]
    • std::chrono(contiene funciones para la biblioteca de fecha y hora) [ 14 ]
    • std::contracts(contiene mecanismos para informar sobre violaciones de contratos) [ 15 ]
    • std::execution(contiene la biblioteca de control de ejecución para ejecución asíncrona, incluyendo task<T>) [ 16 ]
      • std::execution::system_context_replaceability(permite reemplazar la implementación predeterminada del planificador paralelo) [ 17 ]
    • std::filesystem(contiene herramientas para trabajar con manipulación del sistema de archivos, incluyendo directory_entry, path, etc.) [ 18 ]
    • std::linalg(contiene herramientas para álgebra lineal) [ 19 ]
    • std::literals(espacio de nombres en línea que contiene varios operadores para crear literales de un objeto) [ 20 ]
      • std::literals::chrono_literals(espacio de nombres en línea que contiene varios operadores para crear literales de objetos de duración) [ 21 ]
      • std::literals::complex_literals(espacio de nombres en línea que contiene varios operadores para crear literales de números imaginarios) [ 22 ]
      • std::literals::string_literals(espacio de nombres en línea que contiene varios operadores para crear literales de objetos de cadena) [ 23 ]
      • std::literals::string_view_literals(espacio de nombres en línea que contiene varios operadores para crear literales de objetos de vista de cadena) [ 24 ]
    • std::meta(contiene funcionalidades para la reflexión estática (en tiempo de compilación) con el infotipo que representa los metadatos de reflexión)
    • std::numbers(contiene todas las constantes numéricas, como pi, e, etc.) [ 25 ]
    • std::placeholders(contiene todos los objetos marcadores de posición_1 , _2, ..., hasta un máximo definido por la implementación _N) [ 26 ]
    • std::pmr(contiene símbolos para recursos de memoria polimórficos, para una asignación configurada en tiempo de ejecución flexible, así como versiones de los tipos de la biblioteca estándar que utilizan polymorphic_allocatorcomo asignador) [ 27 ]
    • std::ranges(contiene símbolos para trabajar sobre rangos, que extienden las bibliotecas de algoritmos/iteradores) [ 28 ]
      • std::ranges::views(contiene símbolos para adaptadores de rango para crear vistas, para manipulación diferida de colecciones sin copias; también alias como std::views) [ 29 ]
    • std::regex_constants(contiene varias constantes de personalización de expresiones regulares, como ECMAScript, awk, grep, etc.) [ 30 ]
    • std::rel_ops(contiene operadores de comparación generados automáticamente, obsoletos desde C++20) [ 31 ]
    • std::this_thread(contiene funciones para manipular el hilo actual) [ 32 ]

También existe un std::experimentalespacio de nombres, con subespacios de nombres adicionales std::experimental::*para diversas características de especificación técnica/preestandarizadas que pueden ser implementadas por algunos proveedores de compiladores. [ 33 ]

El posixespacio de nombres está reservado, presumiblemente para el uso de las API POSIX , pero actualmente permanece sin usar. Los identificadores que comienzan con dos guiones bajos, o con un guion bajo seguido inmediatamente de una letra mayúscula, están reservados por el estándar. Además, los espacios de nombres stdy posixestán reservados, y agregar declaraciones/definiciones en cualquiera de esos espacios de nombres (o espacios de nombres anidados dentro) constituye un comportamiento indefinido , con algunas excepciones (como std::hash<>y std::formatter<>). [ 34 ]

Módulos estándar

Aunque los módulos se introdujeron por primera vez en C++20 , los módulos de la biblioteca estándar no se estandarizaron como parte del lenguaje hasta C++23 . Anteriormente, las unidades de cabecera de la biblioteca estándar se especificaban para C++20, pero la mayoría de los proveedores de compiladores admiten la retrocompatibilidad de los módulos de la biblioteca estándar a C++20. Estos módulos con nombre se añadieron para incluir todos los elementos declarados tanto en espacios de nombres globales como en los proporcionados por las cabeceras estándar importables. Las macros no se pueden exportar, por lo que los usuarios deben incluir o importar manualmente las cabeceras que generan macros para su uso, o bien pueden exportarse como constantes en tiempo de compilación.std

El estándar C++ tiene reservados stdy std.*como nombres de módulos, [ 35 ] sin embargo, la mayoría de los compiladores permiten una bandera para anular esto. [ 36 ]

Los módulos de la biblioteca estándar son:

std.compatno es un submódulo de std, pero se denomina así para indicar la asociación que el módulo tiene con el stdmódulo (como una versión de "compatibilidad" del mismo). A pesar de que solo existe un módulo para toda la biblioteca estándar, se ha propuesto que se añadan módulos adicionales que proporcionen otros subconjuntos de la biblioteca estándar. [ 38 ] [ 39 ]

Encabezados estándar

Los siguientes archivos contienen las declaraciones de la biblioteca estándar de C++.

Leyenda:  : Obsoleto : Eliminado  

General

Componentes que los programas C++ pueden utilizar para obtener funcionalidades adicionales.

Soporte de idiomas

Componentes que los programas C++ pueden utilizar como soporte durante el desarrollo.

Contenedores/colecciones

Componentes que los programas C++ pueden utilizar para estructuras de datos de contenedores .

Iteradores y rangos

Componentes que los programas C++ pueden usar para manipular iteradores, rangos y algoritmos sobre rangos y contenedores.

Localización

Componentes que los programas C++ pueden utilizar para la localización y la manipulación de la codificación de caracteres.

Instrumentos de cuerda

Componentes que los programas C++ pueden utilizar para la manipulación de cadenas de caracteres.

Flujos, archivos y entrada/salida

Componentes que los programas C++ pueden utilizar para la manipulación de entrada/salida y la manipulación de archivos.

Biblioteca de soporte de subprocesos

Componentes que los programas C++ pueden utilizar para la programación multihilo y concurrente.

Biblioteca numérica

Componentes que los programas C++ pueden utilizar para realizar operaciones seminuméricas o matemáticas.

Biblioteca estándar de C

Cada archivo de cabecera de la biblioteca estándar de C se incluye en la biblioteca estándar de C++ con un nombre diferente, generado al eliminar la extensión de archivo ' .h ' y añadir una ' c ' al principio; por ejemplo, ' ' se convierte en ' '. La única diferencia entre estos archivos de cabecera y los archivos de cabecera tradicionales de la biblioteca estándar de C es que, siempre que sea posible, las funciones deben colocarse en el espacio de nombres. En ISO C, las funciones de la biblioteca estándar pueden implementarse mediante macros , lo cual no está permitido en ISO C++.time.hctimestd::

El uso de los encabezados C con la extensión de archivo ' .h ' quedó obsoleto en C++98, pero posteriormente se volvió a permitir en C++23 por motivos de compatibilidad; no obstante, su uso sigue siendo desaconsejable para código C++ puro.

Los siguientes encabezados son encabezados especiales de compatibilidad con C que no tienen una convención de nomenclatura de C++ correspondiente, lo que significa que se deben usar los encabezados de C si el encabezado es necesario.

Los encabezados de C <stdnoreturn.h>no <threads.h>tienen equivalentes en C++ y sus encabezados de C no son compatibles con C++.

C++ no proporciona la biblioteca C POSIX como parte de ningún estándar, sin embargo, es legal usarla en un programa C++. Si se usa en C++, los encabezados POSIX no se anteponen con una " c " al principio del nombre, y todos contienen el sufijo .h en el nombre del encabezado. La mayoría de los encabezados en la biblioteca POSIX suelen tener una implementación equivalente en C++, como en lugar de .<regex><regex.h>

Biblioteca de redes TS

Los siguientes encabezados están definidos en la TS de redes de C++, que a su vez se basa en la boost::asiobiblioteca de Boost , que aún no está estandarizada en C++. [ 42 ] A pesar de esto, la proporcionan algunos proveedores, como GCC . [ 43 ] Los símbolos se colocan en std::extensions::net.

Véase también

Notas

  1. 1 2 Disponible informalmente en la mayoría de las implementaciones de C++20. [ 37 ]

Referencias

  1. ISO/IEC 14882:2003(E) Lenguajes de programación – C++ §17-27
  2. Köppe, Thomas (11 de junio de 2021). "Aclaración del estado de los "encabezados C"" .
  3. ISO/IEC 14882:2003(E) Lenguajes de programación – C++ §D.5
  4. Stroustrup, Bjarne (1994). El diseño y la evolución de C++ §8.5 . Addison Wesley. ISBN 0-201-54330-3.
  5. Stepanov, Alexander; Lee, Meng (1 de agosto de 1994). "La biblioteca de plantillas estándar" . HP Labs. Archivado del original el 9 de noviembre de 1997. Recuperado el 22 de octubre de 2017 .
  6. " Algoritmos genéricos archivados el 3 de junio de 2023 en la Wayback Machine ", David Musser
  7. "std::nth_element" . cppreference.com. Archivado del original el 29 de marzo de 2018. Consultado el 20 de marzo de 2018 .
  8. " C++ IS Schedule Archived 5 May 2024 at the Wayback Machine ", Herb Sutter
  9. Richard Smith (18 de julio de 2019). "Unidades de cabecera de la biblioteca estándar para C++20" . open-std.org . WG21.
  10. Stephan T. Lavavej, Gabriel Dos Reis, Bjarne Stroustrup, Jonathan Wakely (11 de marzo de 2022). "Módulos de la biblioteca estándar std y std.compat" (PDF) . open-std.org . WG21.{{cite web}}: CS1 maint: varios nombres: lista de autores ( enlace )
  11. "Biblioteca estándar de Apache C++" . Archivado del original el 8 de abril de 2023. Consultado el 20 de septiembre de 2019 .
  12. Porter, Brett (18 de julio de 2013). "La biblioteca estándar de Apache C++ y el ático" . Lista de correo stdcxx-dev. Archivado del original el 23 de julio de 2013. Recuperado el 27 de febrero de 2014 .
  13. cppreference.com. "Índice de símbolos estándar" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  14. cppreference.com. "std::chrono Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  15. cppreference.com. "std::contracts Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  16. cppreference.com. "std::execution Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  17. ^ Lucian Radu Teodorescu, Ruslan Arutyunyan, Lee Howes, Michael Voss (25 de junio de 2025). "Programador paralelo" . open-std.org . GT21.{{cite web}}: CS1 maint: varios nombres: lista de autores ( enlace )
  18. cppreference.com. "std::filesystem Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  19. cppreference.com. "std::linalg Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  20. cppreference.com. "std::literals Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  21. cppreference.com. "std::literals::chrono_literals Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  22. cppreference.com. "std::literals::complex_literals Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  23. cppreference.com. "std::literals::string_literals Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  24. cppreference.com. "std::literals::string_view_literals Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  25. cppreference.com. "std::numbers Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  26. cppreference.com. "std::placeholders Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  27. cppreference.com. "Índice de símbolos std::pmr" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  28. cppreference.com. "std::ranges Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  29. cppreference.com. "std::ranges::views Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  30. cppreference.com. "std::regex_constants Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  31. cppreference.com. "std::rel_ops Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  32. cppreference.com. "std::this_thread Symbol Index" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  33. cppreference.com. "Encabezados experimentales de la biblioteca estándar de C++" . cppreference.com . cppreference.com . Consultado el 29 de marzo de 2026 .
  34. cppreference.com (12 de julio de 2026). "Ampliando el espacio de nombres std" . cppreference.com . cppreference.com.
  35. Comité de Estándares de C++. (2022). P2465R3 - Módulos de C++: Diseño y Evolución . Recuperado de https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2465r3.pdf Archivado el 18 de noviembre de 2022 en Wayback Machine .
  36. "Módulos estándar de C++" .
  37. Stephan T. Lavavej (24 de febrero de 2021). "Unidades y módulos de cabecera de la biblioteca estándar: seguimiento del problema n.º 1694" . github.com . Microsoft Corporation.
  38. Comité de Estándares de C++. (2018). P0581R1 - Módulos para C++ . Recuperado de https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0581r1.pdf
  39. Comité de Estándares de C++. (2021). P2412R0 - Refinamientos adicionales al diseño de módulos de C++ . Recuperado de https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2412r0.pdf Archivado el 20 de noviembre de 2024 en Wayback Machine
  40. Filipek, Bartlomiej. "Asignadores polimórficos, crecimiento de std::vector y hacking" . Archivado del original el 29 de junio de 2020. Recuperado el 30 de abril de 2021 .
  41. "Borrador de trabajo, estándar para el lenguaje de programación C++" (PDF) . open-std.org . ISO/IEC. 1 de abril de 2020. pág. 492. Archivado (PDF) del original el 27 de abril de 2020. Recuperado el 30 de abril de 2021 . 
  42. cppreference.com (3 de febrero de 2026). "Extensiones para redes" . cppreference.com . cppreference.com.
  43. Michael Larabel (13 de octubre de 2018). "GCC9 lanza la implementación inicial de TS de redes en C++" . phoronix.com . Phoronix.

Lecturas adicionales

  • Stroustrup, Bjarne (2013). El lenguaje de programación C++ . Addison-Wesley . ISBN 978-0321563842.
  • Josuttis, Nicolai (2012). La biblioteca estándar de C++: un tutorial y una referencia . Addison-Wesley . ISBN 978-0-321-62321-8.
  • Van Weert, Peter; Gregoire, Marc (14 de junio de 2016). Referencia rápida de la biblioteca estándar de C++ . Presione . ISBN 978-1484218754Archivado del original el 16 de mayo de 2021. Consultado el 24 de marzo de 2017 .
  • Referencia de la biblioteca estándar de C++
  • Referencia de la biblioteca estándar de Microsoft C++
  • Documentación de Rogue Wave SourcePro C++
  • Wiki de la biblioteca estándar de Apache C++ , retirada el 15 de mayo de 2014 (basada en la biblioteca estándar de Rogue Wave C++ 4.1.0)
  • Documentación de la biblioteca estándar C++ de STLport
  • Documentación en línea de la biblioteca GNU C++
  • Documentación de la biblioteca estándar de C++ de LLVM/Clang