<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.ecured.cu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mayle</id>
	<title>EcuRed - Contribuciones del colaborador [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.ecured.cu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mayle"/>
	<link rel="alternate" type="text/html" href="https://www.ecured.cu/Especial:Contribuciones/Mayle"/>
	<updated>2026-06-10T06:41:38Z</updated>
	<subtitle>Contribuciones del colaborador</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Facetas_C%2B%2B&amp;diff=3234436</id>
		<title>Facetas C++</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Facetas_C%2B%2B&amp;diff=3234436"/>
		<updated>2018-11-29T19:54:38Z</updated>

		<summary type="html">&lt;p&gt;Mayle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;{{Definición|Nombre= Facetas C++ |imagen=  |concepto= Las facetas [[C++|C++]] son clases muy flexibles (en realidad clases genéricas); también pueden ser definidas por el usuario o ser adquirida a terceros en forma de librería. Lo mismo que ocurría con los localismos C, las facet también se clasifican en seis categorías, y aunque en este caso los nombres no corresponden a constantes manifiestas, también corresponden a constantes enteras que rememoran muy de cerca los nombres utilizados en C : numeric; time; monetary; ctype;  collate y message}}&lt;br /&gt;
La información y su manipulación, que en el caso de C está contenida en estructuras y en [[Función (programación)|funciones]] globales, ha sido sustituida en [[C++|C++]] por unas clases denominadas facetas (&amp;quot;Facets&amp;quot;) que derivan de una superclase facet.&lt;br /&gt;
Un objeto facet  puede contener prácticamente cualquier aspecto de internacionalización. Por ejemplo, el formato y símbolo de valores monetarios; los de fecha, Etc.  le proporciona un par de docenas de estas clases que proporcionan servicios similares a los proporcionados por la [[Librería Estándar C++|librería Estándar C]]. Un facet encapsula la información local que en C está englobada en una categoría CL_..., aunque de forma más especializada. Por ejemplo, la funcionalidad contenida en la categoría LC_NUMERIC está dispersa en 4 facetas:&lt;br /&gt;
  template &amp;lt;class charT&amp;gt; class numpunct;&lt;br /&gt;
  template &amp;lt;class charT&amp;gt; class numpunct_byname;&lt;br /&gt;
  template &amp;lt;class charT, class InputIterator &amp;gt; class num_get;&lt;br /&gt;
  template &amp;lt;class charT, class OutputIterator&amp;gt; class num_put;&lt;br /&gt;
De estas clases existen espacializaciones para los tipos char y wchar_t, de forma que existen las siguientes:&lt;br /&gt;
&lt;br /&gt;
 numpunct&amp;lt;char&amp;gt;&lt;br /&gt;
 numpunct&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
 numpunct_byname&amp;lt;char&amp;gt;&lt;br /&gt;
 numpunct_byname&amp;lt;wchar_t&amp;gt;	num_get&amp;lt;char&amp;gt;&lt;br /&gt;
 num_get&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
 num_put&amp;lt;char&amp;gt;&lt;br /&gt;
 num_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
== Clasificación ==&lt;br /&gt;
Las facetas [[C++|C++]] se clasifican en seis categorías básicas representadas por constantes enteras cuyos nombres son los indicados.  Aunque también pueden pertenecer a cualquier combinación de bits entre ellas. Dos de estas combinaciones tienen nombres específicos:  none (ninguna) y all (todas).&lt;br /&gt;
Los valores particulares asignados a estas constantes dependen de la implementación. A título de ejemplo mostramos un conjunto de valores posibles:&lt;br /&gt;
&lt;br /&gt;
 // Nombre Valor    Patrón de bits&lt;br /&gt;
 collate  = 1;      // 00000001&lt;br /&gt;
 ctype    = 2;      // 00000010&lt;br /&gt;
 monetary = 4;      // 00000100&lt;br /&gt;
 numeric  = 8;      // 00001000&lt;br /&gt;
 time     = 16;     // 00010000&lt;br /&gt;
 messages = 32;     // 00100000&lt;br /&gt;
 Aparte de las dos combinaciones con nombre propio:&lt;br /&gt;
 none     = 0;      // 00000000&lt;br /&gt;
 all      = 63      // 00111111&lt;br /&gt;
&lt;br /&gt;
Puede existir cualquier otro tipo que sea combinación de los anteriores y que se identificaría por su valor. Por ejemplo, el valor 12 correspondería al tipo numeric-monetary, y el valor 9 al tipo collate-numeric-monetary.  Observe que el tipo all puede definirse como:&lt;br /&gt;
&lt;br /&gt;
 all = (collate | ctype | monetary | numeric | time | message );&lt;br /&gt;
== Las facetas estándar ==&lt;br /&gt;
A continuación se incluye una breve descripción de las categorías básicas. Observe que en realidad las facet estándar son clases genéricas. En la descripción que sigue, una expresión como num_get&amp;lt;charT,InputIterator&amp;gt; significa que la faceta num_get es una plantilla que acepta dos argumentos:  un tipo carácter (charT) y un iterador de entrada.  Observe que muchas de las facetas estándar están desdobladas en dos clases que aceptan respectivamente iteradores de entrada y de salida, según el tipo de operación que soportan.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Categoría&lt;br /&gt;
! Facetas incluidas&lt;br /&gt;
|-&lt;br /&gt;
| numeric&lt;br /&gt;
| numpunct&amp;lt;char&amp;gt;&lt;br /&gt;
num_get&amp;lt;char&amp;gt;&lt;br /&gt;
num_put&amp;lt;char&amp;gt;&lt;br /&gt;
| numpunct&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
num_get&amp;lt;wchar_t&amp;gt; &lt;br /&gt;
num_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| time&lt;br /&gt;
| time_get&amp;lt;char&amp;gt;&lt;br /&gt;
time_put&amp;lt;char&amp;gt;&lt;br /&gt;
| time_get&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
time_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| monetary&lt;br /&gt;
| moneypunct&amp;lt;char&amp;gt;&lt;br /&gt;
moneypunct&amp;lt;char,true&amp;gt;&lt;br /&gt;
&lt;br /&gt;
money_get&amp;lt;char&amp;gt;&lt;br /&gt;
&lt;br /&gt;
money_put&amp;lt;char&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| moneypunct&amp;lt;wchar_t&amp;gt; &lt;br /&gt;
&lt;br /&gt;
moneypunct&amp;lt;wchar_t,true&amp;gt;&lt;br /&gt;
&lt;br /&gt;
money_get&amp;lt;wchar_t&amp;gt; &lt;br /&gt;
&lt;br /&gt;
money_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ctype&lt;br /&gt;
| ctype&amp;lt;char&amp;gt;&lt;br /&gt;
codecvt&amp;lt;char,char,mbstate_t&amp;gt;&lt;br /&gt;
| ctype&amp;lt;wchar_t&amp;gt; &lt;br /&gt;
codecvt&amp;lt;wchar_t,char,mbstate_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| collate&lt;br /&gt;
| collate&amp;lt;char&amp;gt;&lt;br /&gt;
| collate&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| messages&lt;br /&gt;
| messages&amp;lt;char&amp;gt;&lt;br /&gt;
| messages&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Numeric ===&lt;br /&gt;
Las facetas num_get&amp;lt;charT, InputIterator&amp;gt; y num_put&amp;lt;charT, OutputIterator&amp;gt; manejan el formateo numérico. Estas clases disponen de métodos get() y put() en versiones para los tipos long, double, etc. La faceta numpunct&amp;lt;charT&amp;gt; especifica la puntuación de los formatos numéricos. Para ello dispone de métodos como decimal_point(), thousands_sep(), etc.&lt;br /&gt;
=== Time ===&lt;br /&gt;
Las clases time_get&amp;lt;charT, InputIterator&amp;gt; y time_put&amp;lt;charT, OutputIterator&amp;gt; manejan los localismos relativos a fecha y hora.  Disponen de métodos como get_time(), get_date(), get_weekday(), etc.&lt;br /&gt;
=== Monetary ===&lt;br /&gt;
Las clases money_get&amp;lt;charT, InputIterator&amp;gt; y money_put&amp;lt;charT, OutputIterator&amp;gt; manejan los localismos monetarios. Disponen de métodos get() y put() cuya finalidad es respectivamente analizar o generar una secuencia de dígitos representando una cantidad en fracción monetaria más pequeña la moneda correspondiente. Por ejemplo: la secuencia $1,056.23 en un localismo estándar USA puede traducirse en el número 105623 (centavos de Dolar USA) o en la cadena de caracteres &amp;quot;105623&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La plantilla moneypunct&amp;lt;charT, bool&amp;gt; asume con las cantidades monetarias un papel análogo al de la clase numpunct&amp;lt;charT&amp;gt; con los formatos numéricos. Dispone de métodos como curr_symbol(), etc.&lt;br /&gt;
=== Ctype ===&lt;br /&gt;
La clase ctype&amp;lt;charT&amp;gt; encapsula las funcionalidades de clasificación de caracteres mediante métodos como tolower(), toupper(), isspace(), isprint(), etc.  La faceta codecvt&amp;lt;internT, externT, stateT&amp;gt; permite la conversión entre distintos sistemas de codificación. Por ejemplo, del sistema JIS a Unicode.  Sus métodos principales son in() y out(). Existe una especialización de esta plantilla codecvt&amp;lt;wchar_t, char, mbstate_t&amp;gt; que realiza conversiones de sistema multibyte a caracteres anchos.&lt;br /&gt;
=== Collate ===&lt;br /&gt;
La clase collate&amp;lt;charT&amp;gt; permite operaciones de ordenación y comparación de cadenas de caracteres, mediante métodos como compare(), hash() o transform().&lt;br /&gt;
=== Messages ===&lt;br /&gt;
La faceta messages&amp;lt;charT&amp;gt; implementa la especificación del consorcio X/Open para inclusión de mensajes en los programas (recordemos que la internacionalización aconseja mantener los mensajes fuera del cuerpo del ejecutable. Dispone de funciones del tipo open() y close() para mantener catálogos de mensajes.  También para recuperarlos individualmente mediante funciones como get(..., int msgid,...).&lt;br /&gt;
==  Acceder a los locales ==&lt;br /&gt;
Una interesante característica de los locales es la forma en que se acceden sus facetas. Esto no se realiza como cabría esperar mediante un método de la clase locale, sino mediante un par de funciones externas (definidas en la cabecera &amp;lt;locale&amp;gt;), que aceptan un locale como argumento. Es posible determinar si un objeto determinado contiene una faceta mediante la función has_facet(). A su vez la función use_facet() devuelve una referencia a la faceta para que pueda ser utilizada.&lt;br /&gt;
&lt;br /&gt;
Como la mayoría de entidades de la LE, ambas funciones (en realidad son funciones genéricas), están definidas en el subespacio std.&lt;br /&gt;
=== use_facet() ===&lt;br /&gt;
Prototipo&lt;br /&gt;
 template &amp;lt;class Facet&amp;gt; const Facet&amp;amp; use_facet(const locale&amp;amp; loc);&lt;br /&gt;
Este método devuelve una referencia a la faceta Facet señalada en el argumento de la plantilla. La faceta se especifica incluyéndola explícitamente en el argumento de la plantilla (ver ejemplo). Si el tipo señalado por Facet no está presente en el objeto loc, (o en su defecto, en el locale gobal), la función lanza una excepción bad_cast  en caso contrario devuelve una referencia a la faceta, que permanece válida mientras exista una copia del locale loc utilizado.&lt;br /&gt;
Ejemplo (sin incluir ningún dispositivo de control de las posibles excepciones):&lt;br /&gt;
 #include &amp;lt;locale&amp;gt;&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt; using namespace std;&lt;br /&gt;
  &lt;br /&gt;
 int main () {       // ==========&lt;br /&gt;
    locale loc;&lt;br /&gt;
    const ctype&amp;lt;char&amp;gt;&amp;amp; ct = use_facet&amp;lt;ctype&amp;lt;char&amp;gt; &amp;gt;(loc); // M2:&lt;br /&gt;
    cout &amp;lt;&amp;lt; 'a' &amp;lt;&amp;lt; ct.toupper('c') &amp;lt;&amp;lt; endl;     // -&amp;gt; aC&lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
En este caso se construye una referencia ct a la faceta ctype  para los tipos char y se inicia con el valor devuelto por la función use_facet.  A continuación se utiliza el método toupper() del objeto ct para transformar un carácter minúscula a mayúscula.&lt;br /&gt;
&lt;br /&gt;
Observe el espacio entre los símbolos &amp;gt;&amp;gt; de la sentencia M2, que es necesario para que el compilador pueda distinguirlos del operador &amp;gt;&amp;gt;.  Esta invocación de la función genérica use_facet utiliza la sintaxis que hemos denominado instanciación implícita específica.&lt;br /&gt;
&lt;br /&gt;
De los tres [[Compilador|compiladores]] probados:  Borland C++ 5.5;  MS Visual [[C++|C++]] 6.0 y GNU cpp 2.95.2, solo el de Borland compila el ejemplo sin problemas.  El manual Borland señala que si el compilador no soporta este tipo de instanciación específica (una característica relativamente nueva del lenguaje que no está totalmente implementada en muchos compiladores), es preciso utilizar una sintaxis alternativa, correspondiente a una versión sobrecargada de la anterior que si puede ser soportada por el compilador:&lt;br /&gt;
&lt;br /&gt;
 template &amp;lt;class Facet&amp;gt; const Facet&amp;amp; use_facet(const locale&amp;amp; loc, Facet* pf);&lt;br /&gt;
&lt;br /&gt;
En este supuesto, la sentencia M2 del ejemplo quedaría como sigue:&lt;br /&gt;
&lt;br /&gt;
 const ctype&amp;lt;char&amp;gt;&amp;amp; ct = use_facet(loc,(ctype&amp;lt;char&amp;gt;*)0);&lt;br /&gt;
&lt;br /&gt;
Obsérvese que como segundo argumento se pasa un puntero nulo (valor 0) al que se ha aplicado un modelado  para adaptarlo al tipo esperado por esta nueva versión de use_facet.&lt;br /&gt;
=== has_facet() ===&lt;br /&gt;
Prototipo:&lt;br /&gt;
 template &amp;lt;class Facet&amp;gt; bool has_facet(const locale&amp;amp;) throw();&lt;br /&gt;
Esta [[Función (programación)|función]] permite establecer si un locale tiene un tipo determinado de faceta. Devuelve cierto (true) en caso afirmativo, y falso (flase) en caso contrario. Como en el caso anterior, la instanciación debe realizarse con indicación explícita del tipo a utilizar por la plantilla.&lt;br /&gt;
Ejemplo:&lt;br /&gt;
 #include &amp;lt;locale&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 using namespace std; &lt;br /&gt;
 cout &amp;lt;&amp;lt; ((has_facet&amp;lt;ctype&amp;lt;char&amp;gt; &amp;gt;(L1)) ? &amp;quot;Si&amp;quot; : &amp;quot;NO&amp;quot;) &amp;lt;&amp;lt; endl; // -&amp;gt; Si&lt;br /&gt;
 &amp;lt;/div&amp;gt; &lt;br /&gt;
== Véase también  ==&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Constructor (C++)]]&lt;br /&gt;
*[[Contenedores  C++]]&lt;br /&gt;
*[[Librería Estándar C++]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|Programación C Sharp]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
*[[Code_Blocks]]&lt;br /&gt;
*[[Operadores|Operadores]] &lt;br /&gt;
*[[Tokens|Tokens]]&amp;lt;br&amp;gt; &lt;br /&gt;
*[[Identificadores|Identificadores]]&lt;br /&gt;
*[[Ámbito (Programación)|Ámbito (Programación)]]&lt;br /&gt;
*[[Enumeraciones (Informática)|Enumeraciones (Informática)]] &lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
&lt;br /&gt;
== Fuente  ==&lt;br /&gt;
* [http://http://www.zator.com/Cpp/E5_2_1.htm Facetas C++]&lt;br /&gt;
* [http://c.conclase.net/curso/index.php  Facetas en C.conclase.net]&lt;br /&gt;
* [https://docs.microsoft.com/es-es/cpp/?view=vs-2017 Clase facet]&lt;br /&gt;
[[Category:Informática]] [[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Mayle</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Identificadores_(Inform%C3%A1tica)&amp;diff=3234426</id>
		<title>Identificadores (Informática)</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Identificadores_(Inform%C3%A1tica)&amp;diff=3234426"/>
		<updated>2018-11-29T19:50:17Z</updated>

		<summary type="html">&lt;p&gt;Mayle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Definición|Nombre=Identificador |imagen= |concepto=Conjunto de caracteres alfanuméricos de cualquier longitud que sirve para identificar las entidades del programa}}&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;&lt;br /&gt;
'''Identificadores.''' Un identificador es un conjunto de caracteres alfanuméricos de cualquier longitud que sirve para identificar las entidades del programa (clases, funciones, [[Variables|variables]], tipos compuestos) Los identificadores pueden ser combinaciones de letras y números. Cada lenguaje tiene sus propias reglas que definen como pueden estar construidos. Cuando un identificador se asocia a una entidad concreta, entonces es el &amp;quot;nombre&amp;quot; de dicha entidad, y en adelante la representa en el programa. Nombrar las entidades hace posible referirse a las mismas, lo cual es esencial para cualquier tipo de procesamiento simbólico.'''&amp;lt;br&amp;gt; ''' '' &lt;br /&gt;
== Identificadores en lenguajes informáticos&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
En los lenguajes informáticos, los identificadores son elementos textuales (también llamados [[Símbolos|símbolos]]) que nombran entidades del lenguaje. Algunas de las de entidades que un identificador puede denotar son las variables, las constantes, los tipos de dato, las etiquetas, las subrutinas (procedimientos y funciones) y los paquetes.&amp;lt;br&amp;gt;En muchos [[Lenguajes de programación|lenguajes]] algunas secuencias tienen la forma léxica de un identificador pero son conocidos como palabras clave (o palabras reservadas). Lo habitual es que si un identificador se corresponde con una palabra clave o reservada, éste ya no pueda utilizarse para referirse a otro tipo de entidades como variables o constantes (en unos pocos lenguajes, como PL/1, esta distinción no está del todo clara).&amp;lt;br&amp;gt;Los lenguajes informáticos normalmente ponen restricciones en qué caracteres pueden aparecer en un identificador. Por ejemplo, en las primeras versiones de [[C (lenguaje de programación)|C]] y [[Lenguaje de programación C++|C++]], los identificadores están restringidos para que sean una secuencia de una o más letras ASCII, dígitos numéricos (que en ningún caso deben aparecer como primer carácter) y barras bajas. Las versiones posteriores de estos lenguajes, así como otros muchos más lenguajes modernos soportan casi todos los caracteres Unicode en un identificador. Una restricción común es que no está permitido el uso de espacios en blanco ni [[Operadores|operadores]] del lenguaje.&amp;lt;br&amp;gt;En lenguajes de programación compilados, los identificadores generalmente son entidades en tiempo de compilación, es decir, en tiempo de ejecución el programa compilado contiene referencias a direcciones de memoria y offsets más que identificadores textuales (estas direcciones de memoria u offsets, han sido asignadas por el compilador a cada identificador).&amp;lt;br&amp;gt;En lenguajes interpretados los identificadores están frecuentemente en tiempo de ejecución, a veces incluso como objetos de primera clase que pueden ser manipulados y evaluados libremente. En Lisp, éstos se llaman símbolos.&amp;lt;br&amp;gt;Los [[Compilador (Informática)|compiladores]] e [[Intérpretes|intérpretes]] normalmente no asignan ningún significado semántico a un identificador basado en la secuencia de caracteres actual. Sin embargo, hay excepciones. Por ejemplo:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*En Perl una variable se indica utilizando un prefijo llamado sigil, que especifica aspectos de cómo se interpreta la variable en las expresiones. &lt;br /&gt;
*En Ruby una variable se considera automáticamente como inmutable si su identificador empieza con una letra mayúscula. &lt;br /&gt;
*En Fortran, la primera letra de una variable indica si por defecto es creada como entero o como flotante.&lt;br /&gt;
&lt;br /&gt;
== Identificadores C++&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
Los identificadores C++ pueden contener las letras a a z y A a Z, el guión bajo &amp;quot;_&amp;quot; (&amp;quot;Underscore&amp;quot;) y los dígitos 0 a 9.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== '''Caracteres permitidos'''&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
a b c d e f g h i j k l m n o p q r s t u v w x y z&amp;lt;br&amp;gt;A B C D E F G H I J K L M N O P Q R S T U V W X Y Z&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== '''Dígitos permitidos'''&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
0 1 2 3 4 5 6 7 8 9&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Solo hay dos restricciones en cuanto a la composición:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*El primer carácter debe ser una letra o el guión bajo. El Estándar establece que los identificadores comenzando con guión bajo y mayúscula no deben ser utilizados. Este tipo de nombres se reserva para los [[Compilador (Informática)|compiladores]] y las Librerías Estándar. Tampoco se permite la utilización de nombres que contengan dos guiones bajos seguidos. &lt;br /&gt;
*El estándar ANSI establece que como mínimo serán significativos los 31 primeros caracteres, aunque pueden ser más, según la implementación. Es decir, para que un compilador se adhiera al estándar ANSI, debe considerar como significativos, al menos, los 31 primeros caracteres.&lt;br /&gt;
&lt;br /&gt;
Los identificadores distinguen mayúsculas y minúsculas, así que Sum, sum y suM son distintos para el compilador. Sin embargo, [[C++ (Builder)|C++Builder]] ofrece la opción de suspender la sensibilidad a mayúsculas / minúsculas, lo que permite la compatibilidad con lenguajes insensibles a esta cuestión, en este caso, las variables globales Sum, sum y suM serían consideradas idénticas, aunque podría resultar un mensaje de aviso &amp;quot;Duplicate symbol&amp;quot; durante el enlazado.&amp;lt;br&amp;gt;Con los identificadores del tipo [[Pascal|pascal]] hay una excepción a esta regla, ya que son convertidos siempre a mayúsculas con vistas al enlazado.&amp;lt;br&amp;gt;Los identificadores globales importados desde otros módulos siguen las mismas reglas que los identificadores normales.&amp;lt;br&amp;gt;Aunque los nombres de los identificadores pueden ser arbitrarios (dentro de las reglas señaladas), se produce un error si se utiliza el mismo identificador dentro del mismo ámbito compartiendo el mismo espacio de nombres. Los nombres duplicados son legales en diferentes espacios de nombres con independencia de las reglas de ámbito.&amp;lt;br&amp;gt;Un identificador no puede coincidir con una palabra clave o con el de ninguna función de biblioteca.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Tipos de identificadores&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
El estándar ANSI distingue dos tipos de identificadores:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Identificadores internos; los nombres de macros de preprocesado y todas las que no tengan enlazado externo. El estándar establece que serán significativos, al menos, los primeros 31 caracteres. &lt;br /&gt;
*Identificadores externos; los que corresponden a elementos que tengan enlazado externo. En este caso el estándar es más permisivo. Se acepta que el compilador identifique solo seis caracteres significativos y pueda ignorar la distinción mayúsculas/minúsculas&lt;br /&gt;
&lt;br /&gt;
== Reglas de estilo  ==&lt;br /&gt;
&lt;br /&gt;
Es bastante frecuente que en la enseñanza de [[C++|C++]] (y de cualquier otro [[Lenguaje de programación|lenguaje de programación]]) no se subraye suficientemente la importancia de la elección de los identificadores. En este sentido, los textos se suelen limitar a señalar las reglas formales que impone el lenguaje para la declaración de nombres. Sin embargo, como todos los que tienen que ver con la legibilidad del código, el asunto es de capital importancia. Sobre todo, si se trata de algo más que del consabido programita &amp;quot;Hola mundo&amp;quot;, y desde luego resulta crítico en proyectos medianamente grandes en los que puedan trabajar más de un programador y/o deba ser mantenido por personas distintas de su creador original (lo que antes o después acaba ocurriendo en la informática empresarial).&amp;lt;br&amp;gt;[[C (lenguaje de programación)|C]] y [[C++|C++]] tienen sus propias reglas no escritas, sancionadas por la costumbre, en cuanto a ciertas formas concretas de usar los identificadores. Por ejemplo: Es costumbre utilizar minúsculas para los nombres de [[Variables|variables]] y funciones (con frecuencia se utilizan combinaciones minúsculas/Mayúsculas - por ejemplo getRvalue o rColor-, aunque la inicial suele ser minúscula). Los identificadores de variables automáticas lo más cortos posibles; los de estáticas y globales más largos y descriptivos. Los nombres de constantes simbólicas normalmente en mayúsculas.&amp;lt;br&amp;gt;Ejemplo:&amp;lt;br&amp;gt;void someFunc (int numero, char clave, int* puntero_a_clase); // &amp;lt;br&amp;gt;static tipoCliente = 0; // &amp;lt;br&amp;gt;enum formaPago { CONTADO, CREDITO }; // &amp;lt;br&amp;gt;...&amp;lt;br&amp;gt;someFunc(int n, char k, int *ptr) { // &amp;lt;br&amp;gt; int z, y, z = 2; // &amp;lt;br&amp;gt;}&amp;lt;br&amp;gt;Aparte de las manías o hábitos particulares que pueda tener cada programador, la mayoría de empresas de software medianamente serias disponen de sus propios &amp;quot;Manuales de estilo&amp;quot; o &amp;quot;Reglas de uso&amp;quot;, en los que se recogen las convenciones que deben utilizarse para los identificadores, de forma que se mantenga la máxima homogeneidad posible en el código, lo que a la postre redunda en una mayor legibilidad y facilidad de mantenimiento. En este sentido cabría señalar que, dentro de ciertos límites, no es tan importante cuales sean estas reglas, sino que existan y se respeten.&amp;lt;br&amp;gt;En determinados entornos existen reglas consagradas por el uso. Por ejemplo, en la programación C/C++ para las plataformas [[Microsoft Windows|Windows]] suelen seguirse determinadas convenciones conocidas como Notación Húngara, en la que el identificador de cada variable comienza con una o varias letras (minúsculas) que señalan el tipo de la variable. Por ejemplo, nValor.&amp;lt;br&amp;gt;Los nombres de clases se preceden siempre con una &amp;quot;C&amp;quot; mayúscula, y la siguiente letra también es mayúscula. Por ejemplo: CAboutDlg, CAprenderApp, CMainFrame, etc. Los nombres de variables comienzan por letras fijas según su tipo, pero cuando se refieren a una propiedad de clase, los dos primeros caracteres son &amp;quot;m_&amp;quot; (ejemplo m_nValor, m_wndStatusBar, etc). Los nombres de funciones miembro de clase comienzan siempre con mayúscula, pero la siguiente letra es minúscula. Por ejemplo: DoDataExchange(), InitInstance(), OnAppAbout(), etc.&amp;lt;br&amp;gt;Este tipo de notación presenta la ventaja de con un poco de práctica es mucha la información que puede extraerse de la simple lectura del código.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Véase también  ==&lt;br /&gt;
&lt;br /&gt;
*[[Intérpretes|Intérpretes]] &lt;br /&gt;
*[[Ámbito (Programación)|Ámbito (Programación)]] &lt;br /&gt;
*[[Compilador|Compiladores]] &lt;br /&gt;
*[[Facetas C++]]&lt;br /&gt;
*[[Librería Estándar C++]]&lt;br /&gt;
*[[Tokens|Tokens]] &lt;br /&gt;
*[[Operadores|Operadores]] &lt;br /&gt;
*[[Signos_de_puntuación_(Informática)|Signos de puntuación]]&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
== Fuente  ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.zator.com/Cpp/E3_2_2.htm zator.com]&amp;lt;br&amp;gt; &lt;br /&gt;
*[http://www.carlospes.com/curso_de_algoritmos/03_01_identificadores.php Curso de algoritmos]&amp;lt;br&amp;gt; &lt;br /&gt;
*[http://msdn.microsoft.com/es-es/library/ms175874.aspx Identidicadores]&lt;br /&gt;
&lt;br /&gt;
[[Category:Lenguajes_de_programación]] [[Category:Programación]]&lt;/div&gt;</summary>
		<author><name>Mayle</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Tokens&amp;diff=3234425</id>
		<title>Tokens</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Tokens&amp;diff=3234425"/>
		<updated>2018-11-29T19:50:07Z</updated>

		<summary type="html">&lt;p&gt;Mayle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Definición|Nombre=Tokens (Informática) |imagen= |concepto=Es una cadena de caracteres que tiene un significado coherente en cierto lenguaje de programación}}&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;'''Tokens'''. También llamado componente léxico es una cadena de caracteres que tiene un significado coherente en cierto [[Lenguaje de programación|lenguaje de programación]]. Ejemplos de tokens, podrían ser palabras clave (if, while, int,...), [[Identificadores|identificadores]], números, signos, o un operador de varios caracteres, (por ejemplo,&amp;amp;nbsp;:=).&amp;lt;br&amp;gt;Son los elementos más básicos sobre los cuales se desarrolla toda traducción de un programa, surgen en la primera fase, llamada análisis léxico, sin embargo se siguen utilizando en las siguientes fases (análisis sintáctico y análisis semántico) antes de perderse en la fase de síntesis.&amp;lt;br&amp;gt; &lt;br /&gt;
== Tokens&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
Son los elementos en que el preprocesado desmenuza el [[Código fuente|código fuente]]. En un [[Lenguaje de programación|lenguaje de programación]], los tokens son el equivalente a las palabras y signos de puntuación en el lenguaje natural escrito. Los tokens están separados por elementos de separación que reciben el nombre genérico de separadores &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Tipos de elementos &amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
Comprenden los siguientes tipos de elementos:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Palabras clave (&amp;quot;Keywords&amp;quot;)&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Son identificadores utilizados por el lenguaje para fines especiales, y no pueden ser utilizadas como identificadores (por esta razón se suelen denominar también palabras reservadas). Por ejemplo, no pueden ser utilizadas como nombres de [[Variables|variables]], clases o funciones.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== [[Identificadores|Identificadores]]&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Es un conjunto de caracteres alfanuméricos de cualquier longitud que sirve para identificar las entidades del programa (clases, funciones, variables, tipos compuestos, Etc.) Los identificadores pueden ser combinaciones de letras y números. Cada lenguaje tiene sus propias reglas que definen como pueden estar construidos. En el caso de C++, son las que se indican a continuación. Cuando un identificador se asocia a una entidad concreta, entonces es el &amp;quot;nombre&amp;quot; de dicha entidad, y en adelante la representa en el programa. Por supuesto puede ocurrir que varios [[Identificadores|identificadores]] se refieran a una misma entidad.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Constantes&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
La palabra constante tiene dos connotaciones sutilmente diferentes aunque relacionadas, que conviene distinguir:&amp;lt;br&amp;gt;1- La primera es el sentido normal de la palabra constante en lenguaje natural; es decir, datos (de cualquiera de los tipos posible) cuyos valores se han definido en el momento de escribir el código del programa, y no pueden ser modificados más tarde en tiempo de ejecución (lo que significa que sus valores deben ser resueltos en tiempo de compilación). Dicho en otras palabras: el [[Compilador (Informática)|compilador]] sabe cual es el valor de los objetos declarados como constantes y en base a este conocimiento puede hacer cuantas suposiciones sean válidas para conseguir la mayor eficiencia en tiempo de ejecución.&amp;lt;br&amp;gt;En este sentido, el concepto constante es justamente el opuesto a variable, que corresponde a aquellos objetos-dato que pueden recibir nuevas asignaciones de valor a lo largo del programa. Dicho en otras palabras: entidades cuyo valor solo es conocido en tiempo de ejecución.&amp;lt;br&amp;gt;2. La segunda connotación es la de tipo de objeto-dato. En este sentido podemos afirmar que en [[C++|C++]] los enteros ([[Variables|variables]]) forman un tipo distinto de los enteros constantes (constantes enteras), y que los caracteres (variables) forman un tipo distinto de las constantes carácter. Así pues, distinguimos entre un tipo char y un tipo const char. Como prácticamente todos los tipos de objeto-dato posibles en [[C++|C++]] puede declararse constantes, existe un universo de tipos [[C++|C++]], simétrico al de los tipos de objetos variables, pero de objetos constantes.&amp;lt;br&amp;gt;Como corolario de lo anterior, tenga en mente que, por ejemplo, un entero y una constante entera son tipos distintos y que una constante entera [[C++|C++]] significa algo más que un entero al que no se le puede cambiar su valor.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== [[Operadores|Operadores]]&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Son un tipo de tokens que pueden aparecer en las expresiones, e indican al compilador la realización de determinadas operaciones matemáticas, lógicas y numéricas. Se aplican a variables u otros objetos denominados operandos y su efecto es una combinación de las siguientes acciones:&amp;lt;br&amp;gt;1. Producir un resultado-valor&amp;lt;br&amp;gt;2. Alterar un operando&amp;lt;br&amp;gt;3. Designar un objeto o función.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Signos de puntuación&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Juegan el mismo papel que sus homónimos en el lenguaje natural escrito. Conocidos también como puntuadores, son los que se citan a continuación. La mayoría de ellos tienen un doble uso y en ocasiones funcionan también como [[Operadores|operadores]] &amp;lt;br&amp;gt;[ ] ( ) { } ,&amp;amp;nbsp;;&amp;amp;nbsp;: ... * = #&amp;amp;nbsp;!&amp;amp;nbsp;% ^ &amp;amp;amp; – + | ~ \ ' &amp;quot; &amp;amp;lt; &amp;amp;gt;&amp;amp;nbsp;? . / &lt;br /&gt;
&lt;br /&gt;
En ocasiones, los operadores y signos de puntuación comparten la misma representación escrita. En estos casos, el sentido debe deducirse del contexto y por la forma en que están agrupados los diversos signos.&amp;lt;br&amp;gt;Una vez entregado el fuente al [[Compilador (Informática)|compilador]], es precisamente el analizador sintáctico (&amp;quot;parser&amp;quot;) el encargado de es identificar los tokens. Por ejemplo, la sentencia&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; int i; float f;&amp;lt;br&amp;gt;es descompuesta por el &amp;quot;parser&amp;quot; en los siguientes tokens:&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; int palabra clave&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; i identificador&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;; puntuador&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; float palabra clave&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; f identificador&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;; puntuador &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
== Véase también&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
*[[Analizador sintáctico|Analizador sintáctico]] &lt;br /&gt;
*[[Intérpretes|Intérpretes]] &lt;br /&gt;
*[[Facetas C++]]&lt;br /&gt;
*[[Compilador (Informática)|Compiladores]] &lt;br /&gt;
*[[Analizador sintáctico LL|Analizador sintáctico LL]] &lt;br /&gt;
*[[Analizador sintáctico LR|Analizador sintáctico LR]]&lt;br /&gt;
&lt;br /&gt;
== Fuente  ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.zator.com/Cpp/E3_2.htm www.zator.com]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Lenguajes_de_programación]] [[Category:Programación]]&lt;/div&gt;</summary>
		<author><name>Mayle</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Operadores&amp;diff=3234424</id>
		<title>Operadores</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Operadores&amp;diff=3234424"/>
		<updated>2018-11-29T19:49:54Z</updated>

		<summary type="html">&lt;p&gt;Mayle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;{{Definición|Nombre=Operadores |imagen= |concepto=Son un tipo de [[Tokens|tokens]] que pueden aparecer en las expresiones, e indican al compilador la realización de determinadas operaciones matemáticas, lógicas y numéricas}}'''Operadores'''. Son un tipo de [[Tokens|tokens]] que pueden aparecer en las expresiones, e indican al [[Compilador (Informática)|compilador]] la realización de determinadas operaciones [[Matemáticas|matemáticas]], lógicas y numéricas. Se aplican a variables u otros objetos denominados operandos y su efecto es una combinación de las siguientes acciones:&amp;lt;br&amp;gt; &lt;br /&gt;
*Producir un resultado-valor &lt;br /&gt;
*Alterar un operando &lt;br /&gt;
*Designar un objeto o función.&lt;br /&gt;
&lt;br /&gt;
== Ejemplos&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
*y = a + b;&lt;br /&gt;
&lt;br /&gt;
En esta sentencia, el operador suma + produce un valor nuevo, pero no altera ninguno de los operandos (a y b); a su vez, el nuevo valor es asignado a la [[Variables|variable]] y mediante el operador de asignación =. En este caso el operando de la izquierda sí se ve alterado. &lt;br /&gt;
&lt;br /&gt;
*x++;&lt;br /&gt;
&lt;br /&gt;
Aquí el operador postincremento ++ produce un nuevo valor que es aplicado sobre el propio operando, de forma que queda alterado. Cuando un operador altera un operando se dice que tiene efectos laterales.&amp;lt;br&amp;gt;Nota: por lo general, los operadores aparecen a la derecha de expresiones de asignación (por ejemplo: y = 2 * y + x), pero en ocasiones estos &amp;quot;efectos laterales&amp;quot; se utilizan para conseguir expresiones muy compactas y de un cierto nivel de sofisticación, que incluso no necesitan del operador de asignación para producir el resultado. En estos casos su lógica es un poco más difícil de seguir que cuando estos efectos no se utilizan directamente.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*z = (*fptr)(x, y);&lt;br /&gt;
&lt;br /&gt;
Aquí, el operador de indirección * es aplicado sobre el operando fptr que es un puntero-a-función. El resultado es un designador de función al que se aplica el operador ( ) de invocación de función con dos operandos x e y que actúan como argumentos. A su vez el resultado de este operador (invocación de función) es utilizado como argumento derecho del operador de asignación = que finalmente modifica uno de sus operandos (el operando izquierdo z)&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Clasificación&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
Los operadores se pueden clasificar en unitarios, binarios y ternarios, según que necesiten uno, dos o tres operandos. Los operadores unitarios (denominados también unarios) se clasifican en dos tipos según la posición del operador (representado aquí por @) respecto del operando (representado aquí por n):&amp;lt;br&amp;gt;@n: Operador prefijo. Ejemplo: ++x&amp;lt;br&amp;gt;n@: Operador posfijo. Ejemplo: x++ &lt;br /&gt;
&lt;br /&gt;
== Observaciones &amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
*Los operadores pueden (en cierta forma) considerarse como funciones que tienen un álgebra un tanto especial. De hecho, al tratar la sobrecarga de operadores, veremos que precisamente la forma en que se definen es mediante una función, la función-operador. En este sentido podríamos imaginar que la expresión y = a + b es otra forma de representar algo como: y = suma(a, b). Del mismo modo, la asignación x = y sería algo así: asigna(x, y). Siguiendo con nuestra analogía, podríamos suponer que los operadores unitarios, binarios y ternarios serían funciones que aceptarían unos, dos o tres argumentos respectivamente y que la sobrecarga de operadores no es sino una forma encubierta de sobrecarga de funciones. &lt;br /&gt;
*Aunque las funciones [[C++|C++]] se designan con [[Identificadores|identificadores]] (nombres) que siguen las reglas generales ya señaladas, estas seudo-funciones se identifican con símbolos (+,=,&amp;amp;nbsp;::,*,-&amp;amp;gt;,etc). Muchos de ellos están compuesto de un solo [[Tokens|token]] (que puede estar repetido + y ++) aunque los hay de dos. Estos últimos son: new[], delete[], () y []. &lt;br /&gt;
*Antes de realizar la operación encomendada, los operadores pueden modificar el tipo de los operandos para que sean homogéneos, de forma que la operación pueda realizarse. Por ejemplo, al indicar i + f donde i sea un entero y f un float. Estas promociones se denominan conversiones estándar y son realizadas automáticamente por el compilador, pero deben ser tenidas en cuenta para evitar sorpresas.&lt;br /&gt;
&lt;br /&gt;
En general los operadores aceptan un tipo de operando determinado y específico, produciendo y/o modificando un valor de acuerdo con ciertas reglas, pero [[C++|C++]] permite redefinir la mayoría de ellos. Es decir, permite que puedan aceptar otro tipo de operandos y seguir otro comportamiento sin que pierdan el sentido y comportamiento originales cuando se usan con los operandos normales (los tipos básicos preconstruidos en el lenguaje). Esta circunstancia recibe el nombre de sobrecarga del operador.&amp;lt;br&amp;gt;No son sobrecargables los siguientes:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*( . ) Operador de selección de miembros &lt;br /&gt;
*( .* ) Operador de dereferencia &lt;br /&gt;
*(&amp;amp;nbsp;:: ) Operador de acceso a ámbito &lt;br /&gt;
*(&amp;amp;nbsp;?: ) Operador conditional &lt;br /&gt;
*( # ) Directiva de preprocesado &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Polimorfismo en los operadores&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
Sin estar sobrecargado, dependiendo del contexto (número y tipo de operandos), un operador [[C++|C++]] puede tener más de un significado. Ejemplos:&amp;lt;br&amp;gt; El símbolo ámpersand &amp;amp;amp; puede ser interpretado como:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*[[Operadores_de_manejo_de_bits|AND entre bits]] A &amp;amp;amp; B &lt;br /&gt;
*Operador de referencia y = &amp;amp;amp;x &lt;br /&gt;
*Declarador de referencia int&amp;amp;amp; y = x&lt;br /&gt;
&lt;br /&gt;
El asterisco * puede ser interpretado como:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Declaración de un tipo puntero-a tipo* ptr &lt;br /&gt;
*Operador de indirección x = *ptr &lt;br /&gt;
*Operador de multiplicación x * y &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Precedencia&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
La precedencia es una regla de orden que se asocia con los operadores para establecer cual se aplicará primero en caso de aparecer varios en una misma expresión (una especie de &amp;quot;orden de importancia&amp;quot; de los operadores). Por ejemplo:&amp;lt;br&amp;gt;x = 2 + 3 * 4;&amp;lt;br&amp;gt;¿Cual será el resultado, 20 o 14? &lt;br /&gt;
&lt;br /&gt;
La primera regla en este sentido es que las expresiones se evalúan de izquierda a derecha, aunque no siempre. Por ejemplo, la regla izquierda → derecha nos conduciría a que en la expresión anterior, el valor de x es 20, lo cual no es cierto, ya que en C++ la multiplicación tiene mayor precedencia que la suma, así que el resultado es 14.&amp;lt;br&amp;gt;En C++ existen 16 niveles de precedencia, de modo que la regla izquierda → derecha solo se aplica en caso de operadores del mismo nivel &amp;lt;br&amp;gt;El operador de jerarquía más alta es el paréntesis, lo que aclara y justificada la tradicional costumbre algabráica de utilizar paréntesis para forzar el orden de las operaciones. Por ejemplo, si queremos que en la expresión anterior se ejecute primero el operador suma:&amp;lt;br&amp;gt;x = (2 + 3) * 4; // el resultado es 20&amp;lt;br&amp;gt;Aunque las reglas de precedencia se suponen conocidas por los programadores C++, aconsejamos generosidad a la hora de utilizar paréntesis en las expresiones. Además de facilitar la legibilidad evitan posibles errores. Así, aunque las dos sentencias que siguen son equivalentes, la segunda es de lectura más &amp;quot;relajante&amp;quot;.&amp;lt;br&amp;gt;x = 2 + 3 * 4;&amp;lt;br&amp;gt;x = 2 + (3 * 4); &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
== Véase también  ==&lt;br /&gt;
*[[Tokens|Tokens]]&amp;lt;br&amp;gt; &lt;br /&gt;
*[[Identificadores|Identificadores]]&lt;br /&gt;
*[[Librería Estándar C++]]&lt;br /&gt;
*[[Facetas C++]]&lt;br /&gt;
*[[Contenedores C++]]&lt;br /&gt;
*[[Ámbito (Programación)|Ámbito (Programación)]]  &lt;br /&gt;
*[[Signos de puntuación (Informática)|Signos de puntuación]]&lt;br /&gt;
*[[Operadores aritméticos|Operadores aritméticos]]&lt;br /&gt;
*[[Operadores lógicos|Operadores lógicos]]&lt;br /&gt;
*[[Operadores de manejo de bits|Operadores de manejo de bits]]&lt;br /&gt;
*[[Operador condicional|Operador condicional]]&lt;br /&gt;
*[[Operador coma|Operador coma]]&lt;br /&gt;
*[[Operadores relacionales|Operadores relacionales]]&lt;br /&gt;
*[[Operadores de asignación|Operadores de asignación]]&lt;br /&gt;
*[[Operadores de modelado de tipos|Operadores de modelado de tipos]]&lt;br /&gt;
*[[Operadores añadidos a expresión|Operadores añadidos a expresión]]&lt;br /&gt;
*[[Operador de acceso a ámbito|Operador de acceso a ámbito]]&lt;br /&gt;
*[[Operadores de puntero|Operadores de puntero]]&lt;br /&gt;
*[[Operador new|Operador new]]&lt;br /&gt;
*[[Operador new con matrices|Operador new con matrices]]&lt;br /&gt;
*[[Errores con el operador new|Errores con el operador new]]&lt;br /&gt;
*[[Operador delete|Operador delete]]&lt;br /&gt;
*[[Operador sizeof|Operador sizeof]]&lt;br /&gt;
*[[Operador typeid|Operador typeid]]&lt;br /&gt;
*[[Operador de preproceso|Operador de preproceso]]&lt;br /&gt;
*[[Enumeraciones (Informática)|Enumeraciones (Informática)]] &lt;br /&gt;
*[[Sobrecarga de enumeraciones (Informática)|Sobrecarga de enumeraciones (Informática)]] &lt;br /&gt;
== Fuente&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.zator.com/Cpp/E4_9.htm www.zator.com]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Lenguajes_de_programación]] [[Category:Programación]]&lt;/div&gt;</summary>
		<author><name>Mayle</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Librer%C3%ADa_Est%C3%A1ndar_C%2B%2B&amp;diff=3234421</id>
		<title>Librería Estándar C++</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Librer%C3%ADa_Est%C3%A1ndar_C%2B%2B&amp;diff=3234421"/>
		<updated>2018-11-29T19:49:28Z</updated>

		<summary type="html">&lt;p&gt;Mayle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;{{Definición|Nombre= Librería Estándar C++ |imagen=  |concepto= Una librería es un conjunto de recursos (algoritmos) prefabricados, que pueden ser utilizados por el programador para realizar determinadas operaciones }}''' Librería Estándar C++ '''. [[C++|C++]] no llega al nivel de simplicidad de su antecesor C, pero al igual que aquél, tampoco dispone de utilidades o funciones para entrada o salida implementadas en el propio lenguaje, de modo que estas y otras muchas, como manejo de cadenas de caracteres (strings), manejo de ficheros, funciones matemáticas. son implementadas en forma de librerías externas.&lt;br /&gt;
== Sinopsis ==&lt;br /&gt;
Una librería es un conjunto de recursos (algoritmos) prefabricados, que pueden ser utilizados por el programador para realizar determinadas operaciones. Las declaraciones de las funciones (prototipos) utilizadas en estas librerías, junto con algunas macros y constantes predefinidas que facilitan su utilización, se agrupan en ficheros de nombres conocidos que suelen encontrarse en sitios predefinidos. Por ejemplo, en los sistemas UNIX, en  /usr/include. Estos ficheros se suelen llamar &amp;quot;de cabecera&amp;quot;, porque es tradición utilizar las primeras líneas del programa para poner las directivas #include que los incluirá en el fuente durante la fase de preprocesado.&lt;br /&gt;
== Clases de librerías ==&lt;br /&gt;
Los [[Compilador|compiladores]] [[C++|C++]] incluyen un amplio repertorio de clases, funciones y macros que permiten realizar una amplia variedad de tareas, incluyendo entradas/salidas de bajo y alto nivel; manipulación de cadenas alfanuméricas y ficheros; control de procesos (incluyendo multiproceso); manejo de memoria; cálculos matemáticos y un largo etcétera.&lt;br /&gt;
Este repertorio de recursos es denominado colectivamente como &amp;quot;Rutinas de librería&amp;quot;; &amp;quot;Librerías de ejecución&amp;quot; RTL (&amp;quot;Runtime Librarys&amp;quot;) o simplemente &amp;quot;Librerías&amp;quot;.   Puede decirse que el lenguaje aislado (tal cual) no tiene prácticamente ninguna utilidad sin la concurrencia de estas utilidades. El Estándar C++ las clasifica según su utilidad:&lt;br /&gt;
•	Soporte del lenguaje&lt;br /&gt;
•	Diagnóstico&lt;br /&gt;
•	Utilidades generales&lt;br /&gt;
•	Cadenas alfanuméricas (&amp;quot;Strings&amp;quot;)&lt;br /&gt;
•	Localización&lt;br /&gt;
•	Contenedores&lt;br /&gt;
•	Iteradores&lt;br /&gt;
•	Algoritmos&lt;br /&gt;
•	Cálculo numérico&lt;br /&gt;
•	Entrada/Salida&lt;br /&gt;
=== Librería Estándar C++ ===&lt;br /&gt;
Para poner un poco de orden, el Estándar C++ define la denominada Librería Estándar que debe acompañar a cada implementación del compilador que se adhiera al estándar. Es decir: la norma determina cuales son, como se llaman y como se utiliza este conjunto de algoritmos que deben acompañar (como mínimo) a cada implementación del compilador que quiera llamarse &amp;quot;Estándar&amp;quot;. La última versión, ISO/IEC 14882 del año 1998, especifica que se compone de 32 ficheros de cabecera de nombres fijos y conocidos agrupados según la funcionalidad de los algoritmos. Son los siguientes:&lt;br /&gt;
 &lt;br /&gt;
Ficheros	Funcionalidad/funciones&lt;br /&gt;
&lt;br /&gt;
&amp;lt;algorithm&amp;gt;	Parte de la STL que describe los algoritmos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bitset&amp;gt;	Parte de la STL relativa a contenedores tipo bitset. Set de valores booleanos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;complex&amp;gt;	Parte de la librería numérica de la STL relativa a los complejos .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;deque&amp;gt;	Parte de la STL relativa a contenedores tipo deque;  un tipo de colas: &amp;quot;Double-ended-queue&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;exception&amp;gt;	Parte de la librería de diagnóstico relativa al manejo de excepciones&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fstream&amp;gt;	Flujos hacia/desde ficheros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;functional&amp;gt;	Parte de la STL relativa a Objetos-función&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iomanip&amp;gt;	Manipuladores.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ios&amp;gt;	Supreclases para manejo de flujos de E/S.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iosfwd&amp;gt;	Contiene declaraciones adelantadas de todas las plantillas de flujos y sus typedefs estándar. Por ejemplo ostream.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iostream&amp;gt;	Parte del a STL que contiene los algoritmos estándar de E/S.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;istream&amp;gt;	Algoritmos estándar de flujos de entrada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iterator&amp;gt;	Parte de la STL relacionada con iteradores, un tipo de puntero que permite utilizar los algoritmos de la Librería con las estructuras de datos representadas por los contenedores.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;limits&amp;gt;	Descripción de propiedades dependientes de la implementación que afectan a los tipos fundamentales.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;list&amp;gt;	Parte de la STL relativa a contenedores tipo list;  listas doblemente enlazadas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;locale&amp;gt;	Parte de la STL relativa a la internacionalización.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;map&amp;gt;	Parte de la STL relativa a contenedores tipo map.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;memory&amp;gt;	Utilidades relativas a la gestión de memoria, incluyendo asignadores  y punteros inteligentes (auto_ptr).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;new&amp;gt;	Manejo de memoria dinámica.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;numeric&amp;gt;	Parte de la librería numérica de la STL relativa a operaciones numéricas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ostream&amp;gt;	Algoritmos estándar para los flujos de salida.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;queue&amp;gt;	Parte de la STL relativa a contenedores tipo queue;  colas de objetos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;set&amp;gt;	Parte de la STL relativa a contenedores tipo set.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sstream&amp;gt;	Flujos hacia/desde cadenas alfanuméricas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;stack&amp;gt;	Parte de la STL relativa a contenedores tipo stack;  pilas de objetos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;stdexcept&amp;gt;	Parte de la STL relativa a las clases de las que derivan los objetos lanzados por las excepciones ocasionadas en los algoritmos de la propia STL y otras expresiones.  Estas clases son utilizadas para reportar errores detectados durante runtime.  Los usuarios también pueden utilizar excepciones para reportar errores en sus propios programas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;streambuf&amp;gt;	Parte de la STL relativa al Almacenamiento de flujos de E/S (&amp;quot;Stream buffers&amp;quot;).  Define los tipos que controlan la capa de transporte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;string&amp;gt;	Parte de la STL relativa a contenedores tipo string;  una generalización de las cadenas alfanuméricas para albergar cadenas de objetos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;typeinfo&amp;gt;	Mecanismo de identificación de tipos en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;utility&amp;gt;	Parte de la STL que contiene elementos auxiliares como [[Operadores|operadores]] y pares (pairs).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;valarray&amp;gt;	Parte de la librería numérica de la STL relativa a manejo de matrices numéricas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vector&amp;gt;	Parte de la STL relativa a los contenedores tipo vector; una generalización de las matrices unidimensionales C/C++.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aunque generalmente las librerías no aportan ninguna característica al lenguaje (se supone que son utilidades auxiliares que no forman parte del lenguaje propiamente dicho), una pequeña porción de la Librería Estándar C++ sí aporta características que se consideran pertenecientes a este, de forma que deben estar presentes los ficheros de cabecera correspondientes si se desea usarlas. En concreto se refieren a los siguientes elementos:&lt;br /&gt;
&lt;br /&gt;
•	[[Operadores|operadores]] new, new[], delete y delete[].&lt;br /&gt;
&lt;br /&gt;
•	Clase type_info que corresponde al mecanismo RTTI de identificación de tipos en tiempo de ejecución representado por el operador typeid &lt;br /&gt;
&lt;br /&gt;
•	Rutinas de inicio y terminación.&lt;br /&gt;
&lt;br /&gt;
•	Las excepciones estándar lanzadas por los algoritmos anteriores&lt;br /&gt;
&lt;br /&gt;
=== Librería C ===&lt;br /&gt;
Además de otras nuevas, cuyo diseño e importancia cambian drásticamente la filosofía del lenguaje, C++ incluye prácticamente la totalidad de [[Función_(programación)| funciones]] de la primitiva librería estándar C. A esta librería, mantenida por compatibilidad, la denominamos Librería clásica.&lt;br /&gt;
=== Otras librerías ===&lt;br /&gt;
Además de las que proporciona el estándar y las complementarias que pueda incluir por su cuenta el fabricante del compilador, en los proyectos reales se suelen utilizar infinidad de otras librerías, comerciales o públicas, que facilitan el trabajo en áreas particulares, y en este sentido, recordar que uno de los pecados que el programador novel debe evitar, es la tendencia a querer reinventar constantemente la rueda. De forma que el consejo es utilizar en lo posible librerías que estén probadas y sean fácilmente accesibles. Aunque hay que tener cuidado, porque determinados proyectos exigen que las librerías utilizadas estén perfectamente documentadas y en ciertos casos, que se cuente con los fuentes correspondientes.&lt;br /&gt;
== Componentes ==&lt;br /&gt;
Al referirnos a las librerías C++ utilizamos la terminología siguiente:&lt;br /&gt;
&lt;br /&gt;
•	RTL  Conjunto de librerías que acompañan a un compilador (&amp;quot;Runtime Library&amp;quot;), sean o no estándar.&lt;br /&gt;
&lt;br /&gt;
•	Librería Estándar. Conjunto de librerías cuyo contenido está definido por el Estándar C++ (abreviadamente LE).&lt;br /&gt;
&lt;br /&gt;
•	Libería clásica. Parte de la Librería Estándar correspondiente al C clásico.&lt;br /&gt;
&lt;br /&gt;
•	STL (&amp;quot;Standard Templete Library&amp;quot;). Parte de la LE genuina de C++ (que no es heredada de C) y que responde a la forma &amp;quot;++&amp;quot; de hacer las cosas.&lt;br /&gt;
&lt;br /&gt;
La calidad de un compilador C++ viene determinada en gran medida por la calidad y cantidad de su RTL; por su grado de adherencia al Estándar  y por el grado de soporte que proporciona para la plataforma concreta a que se destina.&lt;br /&gt;
&lt;br /&gt;
En lo que concierne a la programación para MS Windows (las referencias a la plataforma Wintel surgen de forma constante e inevitable), los [[Compilador|compiladores]] Borland C++ y MS Visual C++ son quizás los más conocidos y utilizados.  El primero incluye una completa librería denominada VCL (Visual Component Library. La del segundo es conocida como MFC (Microsoft Foundation Classes).&lt;br /&gt;
&lt;br /&gt;
Linux dispone de su propio compilador: GNU Cpp, que comenzó siendo un compilador C y ha evolucionado a un producto que es en realidad un superconjunto de compiladores. No solo puede compilar código C y C++;  también otros lenguajes como Ada o Fortran;  de forma que es común referirse a ellos como GCC (&amp;quot;GNU Compiler Collection&amp;quot;).  La buena noticia es que existen versiones de este compilador para plataformas Windows, de forma que incluso en este ambiente &amp;quot;Propietario&amp;quot; pueden realizarse desarrollos utilizando herramientas &amp;quot;Open source&amp;quot; &lt;br /&gt;
A grandes rasgos la librería Estándar C++ comprende los siguientes módulos:&lt;br /&gt;
&lt;br /&gt;
•	La denominada Librería Estándar de Plantillas, abreviadamente STL (&amp;quot;Standard Templete Library&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
•	Librería numérica. Parte de la STL que contiene algoritmos especialmente concebidos para computación numérica. Por ejemplo, una clase valarray optimizada para matrices numéricas y una clase complex para manejo y representación estandarizada de números complejos (en realidad una plantilla con especializaciones para los tipos float, double y long double.&lt;br /&gt;
&lt;br /&gt;
•	Utilidades. Parte de la STL dedicada a elementos auxiliares tales como adaptadores y la clase auto_ptr.&lt;br /&gt;
&lt;br /&gt;
•	Unas utilidades de entrada/salida de flujos, denominadas genéricamente iostreams.&lt;br /&gt;
&lt;br /&gt;
•	Una utilidad locale para manejo de localismos.&lt;br /&gt;
&lt;br /&gt;
•	Una clase string para manejo estandarizado de cadenas de caracteres.  En realidad es una instanciación (especialización) de la plantilla basic_string para cadenas de caracteres.&lt;br /&gt;
 &lt;br /&gt;
•	Un esquema para describir de modo uniforme el entorno de ejecución mediante la utilización de una clase estándar denominada numeric_limits y especialización para cada uno de los tipos de datos fundamentales.&lt;br /&gt;
&lt;br /&gt;
•	Utilidades para manejo de memoria.&lt;br /&gt;
&lt;br /&gt;
•	Soporte para utilización de juegos de caracteres y signos de diversos idiomas.&lt;br /&gt;
&lt;br /&gt;
•	Utilidades de diagnóstico y manejo de errores. Incluyen manejo de excepciones y la macro assert.&lt;br /&gt;
&lt;br /&gt;
== Funcionalidad ==&lt;br /&gt;
Si atendemos a su funcionalidad,  las utilidades ofrecidas por la Librería Estándar pueden agruparse en:&lt;br /&gt;
&lt;br /&gt;
•	Clasificación: Clasifican caracteres ASCII, como letras, caracteres de control (no imprimibles), Mayúsculas/minúsculas etc. Se definen en la cabecera &amp;lt;ctype.h&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
•	Entradas/Salidas de Consola: Estas son las denominadas entrada/salida estándar. Por defecto se refieren al teclado y a la pantalla (no pueden utilizarse directamente en aplicaciones de interfaz gráfica).&lt;br /&gt;
&lt;br /&gt;
•	Conversión: Convierten caracteres y cadenas de caracteres desde formato alfabético a numérico de diversos tipos (float, int, long).  También realizan la conversión inversa: de formatos numéricos a representaciones alfabéticas y de mayúsculas a minúsculas y viceversa.&lt;br /&gt;
&lt;br /&gt;
•	Diagnóstico: Son rutinas destinadas a comprobaciones; a descubrir y corregir posibles errores.&lt;br /&gt;
&lt;br /&gt;
•	Directorio: Rutinas para manejo de directorios y sus direcciones (path names).&lt;br /&gt;
&lt;br /&gt;
•	En linea (Inline): Rutinas para versiones inline de funciones. El compilador genera el código correspondiente para las versiones inline cuando se utiliza #pragma intrinsic o si se solicita optimización al compilador (optimización de tiempo de ejecución).&lt;br /&gt;
&lt;br /&gt;
•	Entrada/Salida. Son rutinas que proporcionan manejo de flujos y operaciones de Entrada/Salida a bajo nivel (de Sistema Operativo).&lt;br /&gt;
&lt;br /&gt;
•	Manipulación. Manejo de cadenas y bloques de memoria: copiar, comparar, convertir y buscar.&lt;br /&gt;
&lt;br /&gt;
•	Matemáticas: Para realizar cálculos matemáticos.&lt;br /&gt;
&lt;br /&gt;
•	De Memoria: Proporcionan asignación de memoria dinámica.&lt;br /&gt;
&lt;br /&gt;
•	Miscelánea. Se agrupan aquí rutinas varias, como las que posibilitan saltos (goto) no locales y las que manejan diferencias de tipo cultural o de lenguaje. Por ejemplo representación de números, de moneda, formatos de fecha y hora, clasificación de tipo alfabético.&lt;br /&gt;
&lt;br /&gt;
•	Control de proceso. Rutinas que permiten invocar y terminar nuevos procesos desde otra rutina.&lt;br /&gt;
&lt;br /&gt;
•	Fecha y hora. Incluyen rutinas para conversión y manipulación de variables de medida del tiempo (fecha y hora).&lt;br /&gt;
&lt;br /&gt;
•	Argumentos variables. Rutinas utilizadas cuando se usan listas variables de argumentos, como en los casos de printf(), vscanf().&lt;br /&gt;
== Utilización ==&lt;br /&gt;
La utilización de la Librería Estándar C++ requiere de dos tipos de condiciones que podríamos describir como formales y conceptuales.&lt;br /&gt;
&lt;br /&gt;
1. En cuanto a las primeras (condiciones formales) y habida cuenta que las utilidades aparecen en forma de funciones, resulta evidente que su utilización exige incluirlas en nuestro programa. Para ello se necesitan tres pasos (en realidad las exigencias son las mismas que con cualquier otra función, la diferencia estriba en la forma en que se realizan los pasos b y c):&lt;br /&gt;
&lt;br /&gt;
a:  Incluir en el código fuente las invocaciones a las [[Función_(programación)| funciones]] que estamos utilizando. Ejemplo:&lt;br /&gt;
printf(&amp;quot;Esto es una llamada a la función \&amp;quot;printf\&amp;quot; de librería\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 b:  Incluir en el código fuente los prototipos de dichas funciones.&lt;br /&gt;
&lt;br /&gt;
Puesto que los prototipos ya están incluidos en los ficheros estándar de cabecera, hay que indicar al compilador que los incluya. Esto se realiza poniendo en nuestro fuente (normalmente al principio) una directiva de preprocesado #include que señala el fichero de cabecera que se debe añadir. Por ejemplo, si el manual indica que la función printf está definida en el fichero de cabecera stdio.h ponemos en nuestro código:&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  c:  Incluir en el fuente las definiciones de las funciones utilizadas. Como alternativa se puede indicar al compilador que tales definiciones están en ficheros compilados previamente.&lt;br /&gt;
&lt;br /&gt;
En este último caso se dice que las definiciones de las funciones están en librerías de las que existen dos tipos: estáticas (.LIB, .OBJ y .BPI) y dinámicas (.DLL). Toda la información que necesita el compilador está contenida en los ficheros de cabecera, por lo que las operaciones correspondientes son realizadas de forma automática; con la sola condición de que los ficheros y librerías correspondientes sean accesibles al enlazador.&lt;br /&gt;
&lt;br /&gt;
Las entidades de la Librería Estándar C++ (que no están en ficheros de cabecera .h), se han definido en un espacio de nombres denominado std, por lo que es preciso referirse a él específicamente cuando se quieran utilizar estos recursos.&lt;br /&gt;
&lt;br /&gt;
2. Respecto a las que hemos denominado &amp;quot;condiciones conceptuales&amp;quot;, damos por sentado que la utilización de algoritmos de la Librería exige conocerlos. Pero debemos advertir que existe una gran diferencia entre las rutinas de la que hemos denominado librería clásica y los recursos de la nueva Librería Estándar de Plantillas STL.&lt;br /&gt;
&lt;br /&gt;
En general los algoritmos contenidos en la librería clásica realizan tareas muy sencillas bajo la forma de funciones que, con un cierto número de argumentos, realizan la tarea encomendada. A veces devolviendo un objeto (que puede ser una estructura). Su utilización exige poco más que repasar esta colección de funciones (209 en la última versión del Estándar) hasta encontrar la que mejor se ajusta a nuestras necesidades. Para esto lo mejor es recurrir a la clasificación temática ofrecida en la documentación que acompaña a los compiladores antes que a la lista alfabética de las mismas. A continuación estudiamos atentamente su prototipo y la explicación de funcionamiento que acompaña el manual (eventualmente incluso con un ejemplo) y ya estamos listos para utilizarla. En el peor de los casos suelen bastar un par de pruebas hasta que conseguimos ajustar los argumentos de forma que se consiga el resultado esperado.&lt;br /&gt;
&lt;br /&gt;
Como última recomendación al respecto, sobre todo si pensamos que nuestro programa tendrá una larga vida y/o pensamos portarlo a otras plataformas, aconsejaría echar un vistazo a la sección de &amp;quot;compatibilidad&amp;quot; que acompaña a la descripción de cada función en la documentación de la mayoría de compiladores. Suele ocurrir que el compilador ofrezca muchas más funciones que las estrictamente Estándar C++, y que estas no estén claramente separadas del resto, de forma que es posible que elijamos una función que resuelve nuestro problema pero no es portable, en cuyo caso aconsejaría evitarlas dentro de lo posible.&lt;br /&gt;
&lt;br /&gt;
La utilización de la nueva Librería de Plantillas (STL) exige la asimilación de un nuevo paradigma;  una nueva forma de pensar que, si se tiene experiencia en programación tradicional, exige incluso un &amp;quot;cambio de chip&amp;quot;, ya que estas herramientas conforman un mundo enteramente nuevo y singular.&lt;br /&gt;
&lt;br /&gt;
La STL ofrece un conjunto de recursos flexible, potente y altamente optimizado para resolver una gran variedad de situaciones de programación. Pero esta versatilidad y potencia tributan un precio: su alto grado de parametrización supone algo más que utilizar herramientas aisladas. Es necesario saber ensamblar entre sí los recursos disponibles, que no trabajan aisladamente y que son básicamente de tres tipos: contenedores, iteradores y algoritmos. El resultado es que el proceso de utilizar la STL es algo más complicado que la simple búsqueda de una función que resuelva nuestras necesidades;  que la curva de aprendizaje es ciertamente más ardua que en el caso de la librería clásica, y  que los conceptos involucrados son más abstractos y requieren un conocimiento más extenso de sus fundamentos para utilizarlos. Desde luego, la descripción detallada de todos sus elementos exige un libro completo, y de hecho son muchos los que se han publicado con el objeto exclusivo de describir la STL y/o sus técnicas de uso. En compensación, las contrapartidas obtenidas justifican sin duda el esfuerzo. El programador puede concentrarse más en el problema que en los detalles de su implementación en el fuente, se incremente la productividad y se gana en claridad conceptual.&lt;br /&gt;
== Funciones y macros ==&lt;br /&gt;
Algunas [[Función_(programación)| funciones]] pueden venir implementadas de dos formas: como macro y como función. Por ejemplo, la función isalnum, contenida en &amp;lt;ctype.h&amp;gt;.  Esto significa que además de estar implementada como una función en la correspondiente librería (que se utiliza con los argumentos señalados en el manual), está definida como una macro de preprocesado en &amp;lt;ctype.h&amp;gt;, de forma que salvo indicación contraria al compilador, el preprocesador transforma la llamada del programador en otra serie de sentencias equivalentes que utilizan los mismos argumentos. El resultado es que en el código resultante, que luego pasa al compilador y al enlazador, no existe nada parecido a una llamada a una función isalnum (técnicamente el proceso es una sustitución inline de la función de librería.&lt;br /&gt;
&lt;br /&gt;
Para evitar que esto ocurra y por consiguiente que la llamada a islanum nunca llegue a producirse, basta con indefinir la correspondiente directiva. Esto se hace incluyendo al principio del código, y debajo de la línea #include &amp;lt;ctype.h&amp;gt;, una línea de preprocesado adecuada, en este caso:  #undef isalnum, con lo que el #define del preprocesador quedará sin efecto, con el resultado de que todas las invocaciones a isalnum de nuestro código serán respetadas por el preprocesador. Más tarde el enlazador cargará el código de isalnum (que extrae de la librería) con el resto de nuestro programa, y colocará en cada punto de nuestro código donde aparezca una invocación a isalnum, un salto a la dirección adecuada.&lt;br /&gt;
&lt;br /&gt;
En estos casos, el resultado es el mismo en ambas modalidades: como macro (por defecto) o como función de librería. La elección de una u otra es cuestión de optimización. Para tomar una decisión es necesario comprobar y valorar dos aspectos:&lt;br /&gt;
&lt;br /&gt;
•	El tamaño del ejecutable que resulta en uno y otro caso. Posiblemente mayor si se utiliza la función muchas veces y se adopta la macro.&lt;br /&gt;
&lt;br /&gt;
•	La velocidad de ejecución. Posiblemente mayor si se utiliza la función muchas veces (en bucles muy largos) y se utiliza la macro.&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
== Véase también  ==&lt;br /&gt;
*[[Ciencia de la Información]]&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Contenedores C++]]&lt;br /&gt;
*[[Constructor (C++)]]&lt;br /&gt;
*[[Ficheros en C++]]&lt;br /&gt;
*[[Facetas C++]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|Programación C Sharp]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
*[[Code_Blocks]]&lt;br /&gt;
*[[Operadores|Operadores]] &lt;br /&gt;
*[[Tokens|Tokens]]&amp;lt;br&amp;gt; &lt;br /&gt;
*[[Identificadores|Identificadores]]&lt;br /&gt;
*[[Ámbito (Programación)|Ámbito (Programación)]]&lt;br /&gt;
*[[Enumeraciones (Informática)|Enumeraciones (Informática)]] &lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
&lt;br /&gt;
== Fuente  ==&lt;br /&gt;
* [http://http://www.zator.com/Cpp/E5.htm  Librería Estándar C++]&lt;br /&gt;
* [http://c.conclase.net/curso/index.php  Librería Estándar en C.conclase.net]&lt;br /&gt;
* [https://uvadoc.uva.es/bitstream/10324/17502/1/PID_15_156_Anexo4.pdf  Elementos de la librería estándar C++]&lt;br /&gt;
[[Category:Informática]] [[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Mayle</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Ficheros_en_C%2B%2B&amp;diff=3234419</id>
		<title>Ficheros en C++</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Ficheros_en_C%2B%2B&amp;diff=3234419"/>
		<updated>2018-11-29T19:49:08Z</updated>

		<summary type="html">&lt;p&gt;Mayle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Definición&lt;br /&gt;
|nombre= Ficheros en C++&lt;br /&gt;
|imagen=&lt;br /&gt;
|tamaño=&lt;br /&gt;
|concepto= Es una colección de elementos lógicamente relacionados y almacenados en memoria secundaria. A más bajo nivel, un fichero es una secuencia de bits almacenado en algún dispositivo externo (como por ejemplo uno de memoria secundaria).&lt;br /&gt;
}}'''Ficheros en C++'''. Es simplemente un flujo externo que se puede abrir para entrada (dando lugar a un flujo de archivo de entrada que, para simplificar, llamaremos simplemente archivo o fichero de entrada), para salida (dando lugar a un flujo de archivo de salida que, para simplificar, llamaremos simplemente archivo o fichero de salida) o para entrada-salida(archivo o fichero de entrada-salida o archivo de E/S).&lt;br /&gt;
&lt;br /&gt;
== Definición, apertura y cierre de ficheros ==&lt;br /&gt;
*Declaración de Variables de tipo &amp;quot;Fichero&amp;quot;:&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| ifstream descriptor;             // Para fichero de entrada&lt;br /&gt;
|-&lt;br /&gt;
| ofstream descriptor;            // Para ficheros de salida&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*Apertura de [[Ficheros]] de Texto (supongamos TCadena nombre)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| in.open(nombre);                // Apertura para Lectura&lt;br /&gt;
|-&lt;br /&gt;
| out.open(nombre);   //Apertura para Escritura. (borra el contenido si lo hubiera)&lt;br /&gt;
|-&lt;br /&gt;
| out.open(nombre,ios::app);             //Apertura para añadir datos al final&lt;br /&gt;
|-&lt;br /&gt;
| in.open(nombreios::in ios::out);  //Apertura para Lectura y Escritura&lt;br /&gt;
|-&lt;br /&gt;
| out.open(nombre,ios::in ios::out); //Apertura para Lectura y Escritura&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*Cierre de ficheros: Un fichero anteriormente abierto y con un descriptor asociado a él debe ser cerrado con el fin de liberar los recursos asociados a él de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
descriptor.close( )&lt;br /&gt;
&lt;br /&gt;
== Detección de fin de fichero y otras funciones==&lt;br /&gt;
*La función eof() que devuelve true si se ha alcanzado el final del fichero y falso en cualquier otro caso. REQUIERE LECTURA ADELANTADA: Para que la función eof() devuelva un valor de verdad (actualizado).&lt;br /&gt;
*La funcioón fail() devuelve true si existe un error en una operación de flujo asociada al fichero.&lt;br /&gt;
*La función bad() devuelve true si el flujo está corrupto.&lt;br /&gt;
*La función good() que devuelve true si no existe un error en una operación de flujo y false en caso contrario.&lt;br /&gt;
Antes de empezar a leer o escribir en un fichero es siempre conveniente verificar que la operación de apertura se realizó con éxito.&lt;br /&gt;
&lt;br /&gt;
== Ficheros de texto==&lt;br /&gt;
&lt;br /&gt;
La lectura y la escritura en un archivo de texto se puede realizar directamente con los operadores y al igual que se realiza sobre los flujos estándares cin y cout.&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
&lt;br /&gt;
*[[Ciencia de la Información]]&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Librería Estándar C++]]&lt;br /&gt;
*[[Facetas C++]]&lt;br /&gt;
*[[Contenedores C++]]&lt;br /&gt;
*[[Puntero (C++)]]&lt;br /&gt;
*[[Constructor (C++)]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
&lt;br /&gt;
==Fuente==&lt;br /&gt;
&lt;br /&gt;
*Laboratorio de Programación 1º A E.T.S.I. Informática Gestión&lt;br /&gt;
*[http://www.lcc.uma.es/~pastrana/LP/curso0405/P13_05.pdf Clase Práctica: Ficheros en C++]&lt;br /&gt;
*[http://www.forosuse.org/forosuse/showthread.php?t=3530 Foro Suse]&lt;br /&gt;
*[http://www.todoexpertos.com/categorias/tecnologia-e-internet/programacion/c-y-c------/respuestas/2373771/c-ficheros Todos Expertos]&lt;br /&gt;
&lt;br /&gt;
[[Category: Informática]] [[Category: Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Mayle</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Constructor_(C%2B%2B)&amp;diff=3234418</id>
		<title>Constructor (C++)</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Constructor_(C%2B%2B)&amp;diff=3234418"/>
		<updated>2018-11-29T19:48:48Z</updated>

		<summary type="html">&lt;p&gt;Mayle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Definición&lt;br /&gt;
|nombre= Constructor en C++&lt;br /&gt;
|imagen=cODIGO.jpg.JPG&lt;br /&gt;
|tamaño=200px&lt;br /&gt;
|concepto= Los constructores son funciones miembro especiales que sirven para inicializar un objeto de una determinada clase cuando se declara.&lt;br /&gt;
}}'''Constructor en C++'''. Los constructores tienen el mismo nombre que la clase, no retornan ningún valor y no pueden ser heredados. Además deben ser públicos, no tendría ningún sentido declarar un constructor como privado, ya que siempre se usan desde el exterior de la clase, ni tampoco como protegido, ya que no puede ser heredado.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ejemplo de constructor en una clase llamada pareja==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 #include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
 class pareja&lt;br /&gt;
 {&lt;br /&gt;
   public:&lt;br /&gt;
    //Constructor&lt;br /&gt;
    pareja(int a2, int b2);&lt;br /&gt;
    //Funciones miembros de la clase &amp;quot;pareja&amp;quot;&lt;br /&gt;
    void Lee(int &amp;amp;a2, int &amp;amp;b2);&lt;br /&gt;
    void Guardar(int a2, int b2);&lt;br /&gt;
   private:&lt;br /&gt;
    //Datos miembros de la clase &amp;quot;pareja&amp;quot;&lt;br /&gt;
    int a, b;&lt;br /&gt;
 }&lt;br /&gt;
 pareja::pareja(int a2, int b2)&lt;br /&gt;
 {&lt;br /&gt;
    a = a2;&lt;br /&gt;
    b = b2;&lt;br /&gt;
 }&lt;br /&gt;
 void pareja::Lee(int &amp;amp;a2, int &amp;amp;b2)&lt;br /&gt;
 {&lt;br /&gt;
    a2 = a;&lt;br /&gt;
    b2 = b;&lt;br /&gt;
 }&lt;br /&gt;
 void pareja::Guarda(int a2, int b2)&lt;br /&gt;
 {&lt;br /&gt;
    a = a2;&lt;br /&gt;
    b = b2;&lt;br /&gt;
 }&lt;br /&gt;
 int main(int argc, char *argv[])&lt;br /&gt;
 {&lt;br /&gt;
    pareja par1(12, 32);&lt;br /&gt;
    int x, y;&lt;br /&gt;
    par1.Lee(x, y);&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Valor de par1.a: &amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt;endl;&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Valor de par2.b: &amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt;endl;&lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sobrecarga de constructores==&lt;br /&gt;
&lt;br /&gt;
También pueden definirse varios constructores para cada clase, es decir, la función constructor puede sobrecargarse. La única limitación es que no pueden declararse varios constructores con el mismo número y el mismo tipo de argumentos.&lt;br /&gt;
&lt;br /&gt;
==Constructor copia==&lt;br /&gt;
&lt;br /&gt;
Un constructor de este tipo crea un objeto a partir de otro objeto existente. Estos constructores sólo tienen un argumento, que es una referencia a un objeto de su misma clase.&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
&lt;br /&gt;
*[[Ciencia de la Información]]&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Librería Estándar C++]]&lt;br /&gt;
*[[Facetas C++]]&lt;br /&gt;
*[[Contenedores C++]]&lt;br /&gt;
*[[Puntero (C++)]]&lt;br /&gt;
*[[Ficheros en C++]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
&lt;br /&gt;
==Fuente==&lt;br /&gt;
&lt;br /&gt;
*Curso de C++. Autor: [[Salvador Pozo Coronado]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]][[Category:Programación]]&lt;/div&gt;</summary>
		<author><name>Mayle</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Contenedores_C%2B%2B&amp;diff=3234417</id>
		<title>Contenedores C++</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Contenedores_C%2B%2B&amp;diff=3234417"/>
		<updated>2018-11-29T19:48:29Z</updated>

		<summary type="html">&lt;p&gt;Mayle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;{{Definición|Nombre= Contenedores C++ |imagen=  |concepto= En sentido [[C++|C++]] estricto, un contenedor de la STL es una clase genérica que puede instanciarse para representar diversos tipos de objetos. Esta clase incluye ciertas operaciones  sobre los objetos de su tipo; estas operaciones están representadas por [[Función (programación)|funciones]]-miembro, incluyendo [[Constructores (Programación)|constructores]] y funciones-[[Operadores|operador]], que son a su vez funciones genéricas}}''' Contenedores [[C++|C++]] '''. Al mismo tiempo, desde el punto de vista de las teorías de la información, podemos considerarlos estructuras de datos más o menos adecuadas (según el caso) para aplicarles ciertos algoritmos.&lt;br /&gt;
De su propio nombre (&amp;quot;Containers&amp;quot;) podemos deducir que su misión principal, y razón de su existencia, es su función como estructuras de datos, y en este sentido podemos adelantar que entre sus funcionalidades más destacadas se encuentran la gestión del espacio de almacenamiento necesario.&lt;br /&gt;
Una de las primerísimas ventajas de la utilización de contenedores es que el programador no tiene que enredarse con las cuestiones siempre espinosas de asignar o liberar memoria para los objetos creados, de forma que queda liberado de los [[Operadores|operadores]] [[Operador new|new]] y [[Operador delete|delete]].&lt;br /&gt;
== Filosofía de uso ==&lt;br /&gt;
Una primera pincelada sobre la [[Filosofía|filosofía]] de uso de los contenedores mediante un sencillo ejemplo: si tenemos que manejar un conjunto de enteros, puede utilizarse una [[Matriz|matriz]] de enteros, pero ya hemos señalado  que esta estructura nos obliga a conocer de antemano la cantidad de datos a almacenar (el tamaño de la matriz). En consecuencia, si el número de datos puede variar, esta opción no es muy adecuada. Además, si es importante mantener los datos ordenados, la utilización de una matriz nos obligaría a ingeniar por nuestra cuenta la forma de hacerlo; seguramente mediante complicadas rutinas de &amp;quot;sort&amp;quot; hechas manualmente.&lt;br /&gt;
&lt;br /&gt;
Una alternativa es utilizar como &amp;quot;contenedor&amp;quot; para nuestros enteros una clase genérica de la STL denominada [[Vector|vector]]. En este caso, serían posibles expresiones como las siguientes:&lt;br /&gt;
&lt;br /&gt;
  vector&amp;lt;int&amp;gt; v(3);         // L1:&lt;br /&gt;
  v[0] = 7;                 // L2:&lt;br /&gt;
  v[1] = v[0] + 1;          // L3:&lt;br /&gt;
  v[2] = v[0] + v[1];       // L4:&lt;br /&gt;
&lt;br /&gt;
Al encontrar la primera sentencia, el [[Compilador|compilador]] crea una instancia (especialidad) anónima de la plantilla vector para alojar enteros; a continuación una instancia de ella para alojar tres enteros, a la que denominamos v.&lt;br /&gt;
&lt;br /&gt;
Una primera inspección de las sentencias L2 a L3, nos muestra que la clase ofrece la posibilidad de utilizar con sus miembros el [[Operadores|operador]] subíndice de matriz [ ]. Deducimos por tanto, que dispone de una versión sobrecargada de este operador para los miembros de la clase, lo que nos permite utilizar el objeto v como una matriz, aunque con algunas funcionalidades no incluidas en aquellas.&lt;br /&gt;
&lt;br /&gt;
Después de L4 los valores finales para los miembros de nuestra &amp;quot;matriz&amp;quot; serian:&lt;br /&gt;
 v[0] == 7, v[1] == 8, v[2] == 15&lt;br /&gt;
&lt;br /&gt;
Si deseamos invertir el orden de los elementos de nuestra matriz. Para ello utilizamos una [[Función (programación)|función]] especial:&lt;br /&gt;
&lt;br /&gt;
 reverse(v.begin(), v.end());&lt;br /&gt;
&lt;br /&gt;
después de lo cual, el orden de miembros sería:&lt;br /&gt;
&lt;br /&gt;
 v[0] == 15, v[1] == 8, v[2] == 7&lt;br /&gt;
&lt;br /&gt;
La primera observación es que la función reverse utiliza dos argumentos, que son a su vez el valor devuelto por sendos métodos de clase (los aplicamos sobre nuestro objeto v).  El valor devuelto por estos métodos es lo que se conoce como un [[Iteradores (Programación)|iterador]]; una especie de puntero que señalan al interior de la estructura de datos representada por el contenedor v. En este caso, el primer iterador señala al primer miembro y el segundo a una posición después del último; de esta forma se indican los miembros inicial y final entre los que se realizará la operación de inversión efectuada por reverse.&lt;br /&gt;
&lt;br /&gt;
La segunda observación es que la función reverse no es un método de clase, sino una función global; es lo que denominamos un [[Algoritmo|algoritmo]]. Esta función tiene la peculiaridad de que puede ser aplicado sobre el contenedor vector (y algún otro); que opera sobre un rango de los elementos del contenedor, en nuestro caso sobre la totalidad (esta capacidad de operar sobre una parte de un contenedor es característica de los algoritmos). También que pueden operar sobre otros contenedores produciendo un efecto similar. Por ejemplo, el algoritmo reverse puede operar incluso sobre una simple matriz:&lt;br /&gt;
 char Ch[5] = { 'A', 'E', 'I', 'O', 'U' };&lt;br /&gt;
 reverse(Ch, Ch + 5);&lt;br /&gt;
 for (int i = 0; i &amp;lt; 5; ++i) cout &amp;lt;&amp;lt; &amp;quot;Ch[&amp;quot; &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot;] = &amp;quot; &amp;lt;&amp;lt; Ch[i];&lt;br /&gt;
 Salida:&lt;br /&gt;
 Ch[0] = U Ch[1] = O Ch[2] = I Ch[3] = E Ch[4] = A&lt;br /&gt;
&lt;br /&gt;
Es significativo que el objeto v es una estructura de datos que permite acceder individualmente a sus miembros &amp;quot;como si&amp;quot; fuesen elementos de una matriz. También que se pueden aplicar ciertas operaciones sobre la totalidad, o parte, de esta estructura considerada como una unidad.&lt;br /&gt;
== Clasificación ==&lt;br /&gt;
Existen dos tipos de contenedores: secuencias y asociativos; a su vez se subdividen según el tipo de [[Iteradores (Programación)|iterador]] que soportan.&lt;br /&gt;
&lt;br /&gt;
Las secuencias almacenan los elementos en orden secuencial (de ahí su nombre). El contenedor agrupa a todos sus miembros como una sucesión lineal, y en consecuencia son adecuadas para accesos directos y secuenciales. Un ejemplo de secuencia es una matriz. De hecho, los algoritmos que pueden aplicarse a las secuencias pueden aplicarse también a las matrices.&lt;br /&gt;
&lt;br /&gt;
Las asociaciones almacenan sus miembros en forma de árbol indexado, por lo que son denominados también contenedores asociativos ordenados, y resultan adecuados para accesos aleatorios mediante claves.  La STL proporciona cinco tipos distintos.&lt;br /&gt;
&lt;br /&gt;
La existencia de índices supone una ordenación según los valores de un conjunto de elementos (denominado &amp;quot;de claves&amp;quot;) para el que debe existir un criterio de ordenación. Dicho en otras palabras, los objetos &amp;quot;de clave&amp;quot; deben ser de un tipo para el que estén definidos los operadores relacionales. El árbol es mantenido ordenado de forma automática por los algoritmos de inserción y borrado del contenedor.&lt;br /&gt;
Existen mecanismos para asociar un valor o dato de cualquier tipo con una clave; para encontrar el valor asociado a una clave y para recorrer el conjunto (ordenado) de los elementos.&lt;br /&gt;
&lt;br /&gt;
La [[Librería Estándar C++|Librería Estándar C++]] contiene diez formas de contenedores y tres adaptadores de contenedor (denominados simplemente [[Adapter|adaptadores]]). En esta sección se expondrán brevemente cuales son estas formas; sus características, y cuál es la más adecuada para cada tipo de problema específico. En secciones sucesivas se comentarán individualmente con mayor detalle.&lt;br /&gt;
Relación siguiendo la clasificación utilizada en el Estándar:&lt;br /&gt;
  • Secuencias&lt;br /&gt;
      o	deque&lt;br /&gt;
      o	list&lt;br /&gt;
      o	stack&lt;br /&gt;
      o	vector&lt;br /&gt;
      o	vector &amp;lt;bool&amp;gt;&lt;br /&gt;
  • adaptadores&lt;br /&gt;
      o	queue&lt;br /&gt;
      o	priority_queue&lt;br /&gt;
  • Contenedores asociativos&lt;br /&gt;
      o	map&lt;br /&gt;
      o	multimap&lt;br /&gt;
      o	set&lt;br /&gt;
      o	multiset&lt;br /&gt;
      o	bitset&lt;br /&gt;
== Características ==&lt;br /&gt;
Las características más significativas de las diversas formas de contenedor son:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Contenedor&lt;br /&gt;
! Características&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;big&amp;gt;Secuencias&amp;lt;/big&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| vector&lt;br /&gt;
| Este contenedor es una estructura de datos de tamaño fijo preferentemente. Aunque la STL proporciona herramientas para cambiar el tamaño de un vector de forma dinámica, esta operación es costosa y debe ser evitada dentro de lo posible (en este sentido el vector se comporta como una matriz ordinaria).&lt;br /&gt;
&lt;br /&gt;
Disponen de un buén mecanismo de acceso aleatorio a elementos y de un mecanismo de inserción al final muy eficiente.&lt;br /&gt;
&lt;br /&gt;
Generalmente es preferible utilizar un vector que un deque o un list, a menos que sea frecuentemente necesario insertar datos al comienzo o al final, en cuyo caso es mejor utilizar un deque.  Si por el contrario es frecuente la inserción de elementos en el centro, entonces es preferible un list.&lt;br /&gt;
|-&lt;br /&gt;
| vector&amp;lt;bool&amp;gt;&lt;br /&gt;
| Es una versión de la anterior especial para valores binarios (bits).&lt;br /&gt;
|-&lt;br /&gt;
| list&lt;br /&gt;
| Este contenedor responde a la idéa intuitiva de &amp;quot;lista&amp;quot;, el almacenamiento de objetos en una secuencia lineal que no está necesariamente ordenada (aunque sus miembros pueden ser ordenados fácilmente mediante la función-miembro sort() ). Estos contenedores suelen ser implementados como listas doblemente enlazadas. &lt;br /&gt;
&lt;br /&gt;
Dispone de mecanismos eficientes para insertar elementos al principio, al final o en cualquier posición (utilizando iteradores que denoten posición). Estas operaciones consumen un tiempo constante con independencia del número de elmentos albergados en el contenedor.&lt;br /&gt;
&lt;br /&gt;
Dado que son estructuras lineales, en general los elementos no pueden ser accedidos por subíndices como en un vector.  Es necesario realizar un recorrido lineal por todos los valores, por lo que en las operaciones de acceso se utilizan tiempos proporcionales al número de elementos.&lt;br /&gt;
|-&lt;br /&gt;
| stack&lt;br /&gt;
| Contenedor de elementos tipo pila LIFO que permite inserciones y eliminaciones solo en la parte superior.&lt;br /&gt;
|-&lt;br /&gt;
| deque&lt;br /&gt;
| Los deques o colas de doble terminación (&amp;quot;Double-ended queue&amp;quot;) son un tipo de estructura de datos que comparte las características de las colas (&amp;quot;Queues&amp;quot;) y las pilas (&amp;quot;Stacks&amp;quot;). Como en las colas , los elementos pueden ser empujados por un extremo al interior del contenedor, y el primer elemento introducido puede ser extraído por el extremo opuesto. Al mismo tiempo, el último elemento introducido por el principio puede ser extraído en ese mismo extremo como si fuese una pila.&lt;br /&gt;
 &lt;br /&gt;
Estos contenedores suelen ser implementados bajo la forma de matrices bidimensionales.&lt;br /&gt;
&lt;br /&gt;
Las características de los deques implementados en la STL pueden resumirse en: Acceso aleatorio; mecanismo eficiente de inserción al principio o al final.&lt;br /&gt;
|-&lt;br /&gt;
| string&lt;br /&gt;
| Contenedor de caracteres adaptado a operaciones con cadenas de caracteres.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;big&amp;gt;Asociaciones&amp;lt;/big&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| set&lt;br /&gt;
| Como el resto de contenedores asociativos, esta forma de contenedor mantiene los elementos en orden. Dispone de mecanismos eficientes para inclusión, inserción y eliminación de elementos, y soporta claves únicas (solo puede existir un miembro con una clave determinada).&lt;br /&gt;
|-&lt;br /&gt;
| multiset&lt;br /&gt;
| Versión del anterior que permite la existencia de claves duplicadas. Es decir, distintos elementos dentro del conjunto pueden responder a la misma clave.&lt;br /&gt;
|-&lt;br /&gt;
| bitset&lt;br /&gt;
| Contenedor de bit más orientado al tamaño que hacia el tipo de contenido. Permite almacenar secuencias de bits de tamaño fijo. No existen iteradores para reccorrerlas, y sus elementos se acceden utilizando el operador subíndice.&lt;br /&gt;
 &lt;br /&gt;
Se dispone de varias funciones para realizar con ellos operaciones de bits &lt;br /&gt;
|-&lt;br /&gt;
| map&lt;br /&gt;
| Como el resto de estructuras asociativas, el map mantiene sus elementos ordenados. Se caracteriza porque sus miembros son pares de valores que pueden ser de tipos distintos. Uno de ellos, el que actúa como clave para el índice (&amp;quot;Key-value&amp;quot;), puede ser de cualquier tipo, a condición de que sus elementos puedan ser ordenados según un criterio (por defecto se utiliza el operador &amp;lt;).&lt;br /&gt;
 &lt;br /&gt;
Permite claves únicas. Es decir, que solo puede existir un miembro para cada clave. Dispone de mecanismos de inserción y borrado muy eficientes y no existe límite de tamaño. La estructura se encarga de crecer y disminuir en concordancia con las necesidades de sus miembros. Permite el operador [ ] subíndice para los elementos de la clave así como otras técnicas de acceso.&lt;br /&gt;
&lt;br /&gt;
Estas estructuras de datos recibe también los nombres de diccionarios, tablas y matrices asociativas, en referencia a que pueden considerarse como dos matrices del mismo número de elementos, en las que existe una relación entre cada miembro de una con otro miembro de la otra.  Una de las matrices (que actúa de índice) estaría ordenada según su contenido&lt;br /&gt;
|-&lt;br /&gt;
| multimap&lt;br /&gt;
| En todo igual que el anterior pero permitiendo además claves duplicadas. Es decir, que una misma clave pueda estar asociada a dos &amp;quot;valores&amp;quot; distintos.&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Adaptador&lt;br /&gt;
! Características&lt;br /&gt;
|-&lt;br /&gt;
| queue&lt;br /&gt;
| Contenedor tipo cola FIFO que permite inserciones al final y eliminaciones al principio.&lt;br /&gt;
|-&lt;br /&gt;
| priority queue&lt;br /&gt;
| Este contenedor dispone de mecanismos eficientes para acceso y eliminación de grandes valores.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Seleccionar un contenedor ==&lt;br /&gt;
El binomio contendor-iterador conforma una herramienta que se adapta a circunstancias muy variadas. Es posible que un determinado problema pueda ser abordado de varias formas, en estos casos la selección de la forma de contenedor más adecuado depende de las circunstancias. En ciertas ocasiones puede resultar bastante obvia; en otras puede no estar tan claro cuál es la mejor opción, pues &amp;quot;a priori&amp;quot;, pueden adaptarse varias formas al caso concreto. Puede utilizarse el sistema de prueba y comparación. Por ejemplo, cronometrando los resultados obtenidos en un modo u otro. También será de gran ayuda la experiencia, pero como una guía o criterio general puede utilizarse el principio de selección que se indica a continuación.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Como se accederá a los datos?.&lt;br /&gt;
| Si es importante un acceso aleatorio, pueden utilizarse un vector o un deque. Si basta con un acceso secuencial cualquiera de los dos puede ser el elegido.&lt;br /&gt;
|-&lt;br /&gt;
| Es importante el orden en que serán mantenidos los valores dentro de la colección de datos?&lt;br /&gt;
| Existen muchas formas de secuenciar los valores. Si es importante un orden estricto a lo largo de toda la vida del contenedor, la elección obvia es un set, dado que las inserciones en una de estas estructuras se realizan automáticamente en orden.&lt;br /&gt;
 &lt;br /&gt;
Si este orden es importante solo en algún momento, por ejemplo al final de una serie de inserciones, puede ser más sencillo colocar los valores en un list o vector para ordenar más tarde el resultado en el momento necesario.&lt;br /&gt;
&lt;br /&gt;
Si el orden en que se almacenan los valores en la estructura está relacionado con el orden de su inserción, entonces un stack, un queue o un list pueden ser la mejor elección.&lt;br /&gt;
|-&lt;br /&gt;
| Puede variar mucho el tamaño de la estructura de datos durante el curso de la ejecución del programa?&lt;br /&gt;
| Si es así, entonces puede ser que la mejor opción sean un list o un set. Un vector o un deque pueden conducir a mantener un gran almacenamiento intermedio (buffer); incluso después que los elementos hayan sido eliminados de la colección de datos. Estos dos contenedores no son adecuados para cambios de tamaño, aunque vector dispone de un mecanismo de inserción al final eficiente.&lt;br /&gt;
 &lt;br /&gt;
Recíprocamente: si el tamaño de la colección se mantiene relativamente estable, entonces un vector o un deque pueden utilizar menos memoria que un list o un set que almacenen el mismo número de elementos.&lt;br /&gt;
|-&lt;br /&gt;
| Es posible determinar el tamaño de la colección?&lt;br /&gt;
| La estructura de datos vector proporciona un medio para pre-seleccionar un bloque de memoria de un tamaño específico con la función miembro reserve, posibilidad que no existe en otros contenedores.&lt;br /&gt;
|-&lt;br /&gt;
| Es frecuente tener que comprobar si un valor cualquiera está incluido en la colección?&lt;br /&gt;
| En este caso, un contenedor set o map pueden ser buena elección. En estos casos comprobar si un determinado valor está incluido puede ser realizado con un pequeño número de pasos (logarítmicos con el tamaño del contenedor). Mientras que la misma verificación en cualquiera de los otros tipos puede requerir comparar el valor con cada elemento almacenado en el contenedor.&lt;br /&gt;
|-&lt;br /&gt;
| Está indexada la colección de datos? &lt;br /&gt;
| Si las claves son enteros entre 0 y un límite superior, pueden utilizarse un vector o un deque. &lt;br /&gt;
|-&lt;br /&gt;
| Si es así, puede ser vista la colección como una serie de pares clave/valor?&lt;br /&gt;
| Si la clave es algún otro valor, como cadenas de caracteres o tipos definidos por el usuario, puede utilizarse un contenedor map.&lt;br /&gt;
|-&lt;br /&gt;
| Pueden los valores estar relacionados unos con otros?&lt;br /&gt;
| Todos los valores almacenados en cualquier contenedor de la STL debe ser capaz de comprobar la igualdad con cualquier otro valor similar, pero recuerde que no todos son capaces de reconocer el operador de relación menor-que; sin embargo, si los valores no pueden ser ordenados utilizando el operador menor-que, no pueden ser almacenados en un set o en un map.&lt;br /&gt;
|-&lt;br /&gt;
| Es una operación frecuente tener que encontrar y eliminar el valor mayor de la colección?&lt;br /&gt;
| En caso afirmativo, la estructura de datos más idónea es el priority queue.&lt;br /&gt;
|-&lt;br /&gt;
| En que posiciones son insertados o eliminados los elementos de la estructura?&lt;br /&gt;
| Si los valores son añadidos o eliminados en la zona interior, entonces la mejor opción es un list.&lt;br /&gt;
 &lt;br /&gt;
Si los valores son insertados solo al comienzo, un deque o un list pueden ser lo más adecuado.&lt;br /&gt;
&lt;br /&gt;
Si los valores son insertados y eliminados solo al final, un stack o un queue pueden ser elecciones lógicas.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Es frecuente tener que refundir dos o más secuencias en una sola?&lt;br /&gt;
| En caso afirmativo, puede considerarse que las mejores opciones son un set o un list, dependiendo que la colección deba o no ser mantenida en orden.&lt;br /&gt;
 &lt;br /&gt;
Refundir dos set es una operación muy eficiente.  Si la colección de datos no está ordenada, pero puede utilizarse la función miembro splice() de las list (que es muy eficiente), entonces es preferible este último tipo de contenedor, dado que esta operación no está contemplada en las demás formas.&lt;br /&gt;
|}&lt;br /&gt;
=== Tipos no incluidos ===&lt;br /&gt;
La [[Librería Estándar C++|Librería Estándar C++]] incluye contenedores adecuados para la mayoría de los casos prácticos, aunque quizás existen una serie de estructuras de datos clásicas que no han sido incluidas. En la mayoría de los casos, la causa es que los contenedores proporcionados pueden ser fácilmente adaptados para suplir los usos facilitados por los tipos omitidos.&lt;br /&gt;
&lt;br /&gt;
Tipos clásicos no incluidos y la sustitución más fácil.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Contenedor omitido&lt;br /&gt;
! Sustitución utilizando elementos de STL&lt;br /&gt;
|-&lt;br /&gt;
| tree&lt;br /&gt;
| El modo set está implementado internamente como un árbol de búsqueda binaria. &lt;br /&gt;
&lt;br /&gt;
Para la mayoría de los casos prácticos que pueden ser resueltos utilizando árboles este modo es un sustituto adecuado.&lt;br /&gt;
|-&lt;br /&gt;
| matrices multidimensionales&lt;br /&gt;
| Puesto que los vectores pueden almacenar elementos que sean otros vectores, estas estructuras pueden ser construidas fácilmente.&lt;br /&gt;
|-&lt;br /&gt;
| graph&lt;br /&gt;
| La representación de un gráfico puede ser fácilmente construida como un map que contiene otros map. Un map cuyos elementos son a su vez maps, es la representación natural de un gráfico directo. &lt;br /&gt;
|-&lt;br /&gt;
| sparse array&lt;br /&gt;
| Una novedosa sustitución es la representación de un gráfico&lt;br /&gt;
|-&lt;br /&gt;
| hash table&lt;br /&gt;
| Las tablas hash proporcionan un tiempo de acceso constante, así como inserción y borrado de elementos, convirtiendo estas operaciones en operaciones de índice.&lt;br /&gt;
 &lt;br /&gt;
Una tabla hash puede ser construida fácilmente como un vector (o deque) cuyos elementos son lists (o incluso sets).  En el ejemplo de la ordenación raíz (  xxx) se describe una de estas estructuras (un vector de deques), aunque en este ejemplo no incluye invocación la función hash para convertir un valor en un índice.&lt;br /&gt;
|-&lt;br /&gt;
| Funcionalidad set&lt;br /&gt;
| En la STL, los tipos set están específicamente ordenados, y sus operaciones (como la unión intersección, etc.) no pueden ser realizadas sobre colecciones de valores no ordenados (por ejemplo un conjunto de números complejos).&lt;br /&gt;
 &lt;br /&gt;
Una list puede ser utilizada como sustituto, aunque es necesario escribir funciones de operación especiales, dado que los algoritmos genéricos no pueden ser utilizados con listas.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Gestión de memoria ==&lt;br /&gt;
La gestión de memoria realizada por los contenedores comprende tanto la asignación y liberación de espacio para sus miembros, como para las claves que constituyen el sistema de índice de algunos tipos de contenedor. En general los algoritmos de la STL están muy optimizados y el sistema de asignación de memoria intenta compaginar rapidez y eficacia. La primera exige asignar y desasignar espacio cada vez que se introduce o elimina un miembro del contenedor. La eficacia, e incluso la disminución de la fragmentación inherentes al manejo del montón, exige asignar y rehusar trozos de memoria lo más grandes posible cada vez. El abordaje a este problema se ha realizado de dos formas básicas: (a) Contenedores que no pueden alterar su tamaño, de forma que la asignación de espacio para sus elementos debe realizarse en el momento de su declaración. (b) Contenedores que pueden crecer y/o disminuir en consonancia con los elementos a albergar.&lt;br /&gt;
&lt;br /&gt;
Refiriéndonos al caso (b), para balancear estas exigencias contrapuestas, algunas implementaciones utilizan el siguiente esquema de trabajo: inicialmente el sistema asigna al contenedor un trozo de memoria de tamaño adecuado para contener cierto número de elementos; espacio que es utilizando hasta que se agota. A partir de aquí, cada nueva demanda origina la asignación una zona de doble tamaño que la anterior. Por ejemplo, supongamos que para gestionar un vector de enteros, el compilador asigna inicialmente espacio para un máximo de 16 miembros.  Cuando se agotara, se realizaría una nueva asignación de espacio para 32 miembros, e inmediatamente se efectuaría una recolocación del contenido actual en el nuevo espacio y la liberación del primitivo. Si el nuevo contenedor quedara lleno de nuevo, la siguiente asignación sería capaz de 64 miembros y así sucesivamente.&lt;br /&gt;
&lt;br /&gt;
El factor de aumento de tamaño puede ser cualquiera. Muchos compiladores utilizan un factor 1.5 cada vez que deben ampliar el espacio necesario.&lt;br /&gt;
&lt;br /&gt;
Cada nueva recolocación implica varios pasos:&lt;br /&gt;
  •	Asignación de memoria al estilo malloc() de la librería clásica en cantidad suficiente para el nuevo tamaño.&lt;br /&gt;
  •	Copia de los elementos actuales en la nueva localización. Los elementos son colocados en la nueva situación utilizando el constructor copia.&lt;br /&gt;
  •	Actualización de las estructuras internas del nuevo contenedor (sistema de índices).&lt;br /&gt;
  •	Eliminación de los elementos originales mediante invocación sucesiva de sus correspondientes destructores.&lt;br /&gt;
  •	Liberación de la memoria utilizada por las estructuras internas.&lt;br /&gt;
  •	Liberación de la zona original mediante una invocación al estilo free de la librería clásica.&lt;br /&gt;
&lt;br /&gt;
En general, al referirse al tamaño de un contenedor existen tres magnitudes distintas aunque relacionadas, cuyos valores pueden obtenerse mediante tres métodos:&lt;br /&gt;
&lt;br /&gt;
  •	El número de elementos contenidos actualmente. size()&lt;br /&gt;
  •	El máximo número de elementos que pueden alcanzarse actualmente sin necesidad de una nueva recolocación. capacity()&lt;br /&gt;
  •	El máximo número de elementos que pueden alcanzarse en cualquier caso. max_size().&lt;br /&gt;
&lt;br /&gt;
 Ejemplo:&lt;br /&gt;
   #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
   using namespace std;&lt;br /&gt;
   #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   int main() {         // ================&lt;br /&gt;
   vector&amp;lt;int&amp;gt; vInt;&lt;br /&gt;
   for (int i=0; i &amp;lt; 100; i++) vInt.push_back(i);&lt;br /&gt;
&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;Tamaño actual:   &amp;quot; &amp;lt;&amp;lt; vInt.size()     &amp;lt;&amp;lt; endl;&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;Capacidad actual: &amp;quot; &amp;lt;&amp;lt; vInt.capacity() &amp;lt;&amp;lt; endl;&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;Tamano maximo:   &amp;quot; &amp;lt;&amp;lt; vInt.max_size() &amp;lt;&amp;lt; endl;&lt;br /&gt;
   return 0;&lt;br /&gt;
   }&lt;br /&gt;
   Salida:&lt;br /&gt;
   Tamaño actual: 100&lt;br /&gt;
   Capacidad actual: 256&lt;br /&gt;
   Tamano maximo: 1073741823&lt;br /&gt;
&lt;br /&gt;
En todos los casos: size() &amp;lt;= capacity()&lt;br /&gt;
&lt;br /&gt;
Es posible comprobar si un contenedor está vacío, comparando su tamaño actual size() con cero, aunque es más rápido utilizar el método empty(), que devuelve true si realmente size() == 0.&lt;br /&gt;
&lt;br /&gt;
=== Reserva de espacio ===&lt;br /&gt;
Como puede suponer, cada recolocación supone un proceso considerable, sobre todo en contenedores muy grandes. Para evitar sus inconvenientes si se conoce de antemano el tamaño máximo a utilizar, la STL ofrece la posibilidad de preasignar un espacio arbitrario. Para esto se dispone del método reserve(n), que garantiza la asignación de espacio inicial suficiente para alojar n miembros en el contenedor. Si el argumento n es mayor que la capacidad actual, se produce una recolocación y el nuevo argumento determina la nueva capacidad. Si es menor no se produce ninguna acción.&lt;br /&gt;
&lt;br /&gt;
Ejemplo, para crear un vector de enteros capaz para al menos 1000 miembros:&lt;br /&gt;
  vector &amp;lt;int&amp;gt; v;&lt;br /&gt;
  v.reserve(1000);&lt;br /&gt;
&lt;br /&gt;
En el siguiente ejemplo se muestran los resultados compilado con Borland C++ 5.5 para Win32; con MS Visual C++ 6.0 y con GNU gcc 2.95.3 para Linux:&lt;br /&gt;
  // resultados con:         BC++   VC++   GNU   &lt;br /&gt;
  vector&amp;lt;int&amp;gt; v;&lt;br /&gt;
  cout &amp;lt;&amp;lt; v.size();      // -&amp;gt; 0      0      0   &lt;br /&gt;
  cout &amp;lt;&amp;lt; v.capacity();  // -&amp;gt; 0      0      0&lt;br /&gt;
  v.push_back(3);&lt;br /&gt;
  cout &amp;lt;&amp;lt; v.size();      // -&amp;gt; 1      1      1&lt;br /&gt;
  cout &amp;lt;&amp;lt; v.capacity();  // -&amp;gt; 256    1      1&lt;br /&gt;
  v.reserve(100);&lt;br /&gt;
  cout &amp;lt;&amp;lt; v.size();      // -&amp;gt; 1      1      1&lt;br /&gt;
  cout &amp;lt;&amp;lt; v.capacity();  // -&amp;gt; 256    100    100&lt;br /&gt;
&lt;br /&gt;
=== Operaciones sobre contenedores ===&lt;br /&gt;
Los elementos de un contenedor son colocados en él utilizando el constructor copia, aunque algunas operaciones requieren la existencia de un constructor por defecto. A su vez, los algoritmos genéricos, como copy(), que copian a un contenedor, utilizan el operador de asignación.&lt;br /&gt;
&lt;br /&gt;
Cuando se duplica todo un contenedor de tipos T por invocación del [[Constructor (C++)|constructor]] copia o por asignación, cada miembro es copiado en la nueva estructura utilizando el constructor copia o el operador de asignación. Tanto si una copia profunda o una copia somera, el resultado es controlado por el programador, que puede proporcionar el operador de asignación para el tipo T con cualquier significado que desee. Si se ha definido un destructor para el tipo T, este destructor es invocado cada vez que deba ser eliminado un elemento del contenedor. Cuando se destruye toda la colección, el destructor es invocado por cada elemento que permaneciera almacenado.&lt;br /&gt;
&lt;br /&gt;
En estos casos, el contenedor es solamente responsable de mantener los propios punteros, siendo responsabilidad del programador manejar la memoria de los valores referenciados por estos, lo que supone que los espacios de memoria son asignados correctamente; por lo general mediante el operador new; que no son desasignados mientras el contenedor albergue referencias a ellos, y que sean adecuadamente desasignados una vez que han sido eliminados del contenedor.&lt;br /&gt;
&lt;br /&gt;
===  Secuencias ===&lt;br /&gt;
Las secuencias son estructuras de datos de tipo lineal, con posibilidad de que su tamaño puede ser alterado insertando elementos al principio, al final o en cualquier posición, si bien la idoneidad en este sentido es distinta entre los diversos tipos.&lt;br /&gt;
&lt;br /&gt;
La STL ofrece los siguientes:&lt;br /&gt;
  • deque&lt;br /&gt;
  • list&lt;br /&gt;
  • stack&lt;br /&gt;
  • vector&lt;br /&gt;
  • vector&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura lineal implica que sus datos son lógicamente contiguos, aunque su disposición física puede que no lo sea. Los elementos pueden ser accedidos por un índice numérico, aunque en algunos tipos de secuencia el acceso a un elemento implica un recorrido por la lista.&lt;br /&gt;
&lt;br /&gt;
== Contenedores asociativos ==&lt;br /&gt;
Los contenedores asociativos son una extensión de las secuencias. Mientras que en estas para acceder a los elementos solo pueden utilizarse claves numéricas, que señalan el número de orden del elemento dentro de la secuencia (al estilo de los índices en las matrices). Los contenedores asociativos admiten cualquier tipo de clave de acceso. Las más frecuentes son las cadenas alfanuméricas (stings).&lt;br /&gt;
&lt;br /&gt;
Las asociaciones almacenan sus miembros en forma de árbol indexado, razón por la que son denominados también contenedores asociativos ordenados, y resultan adecuados para accesos aleatorios mediante claves.&lt;br /&gt;
&lt;br /&gt;
La ordenación se realiza según los valores de ciertos miembros del contenedor. Estos elementos son denominados &amp;quot;de claves&amp;quot; (&amp;quot;Key values&amp;quot;). Lo que exige que los objetos &amp;quot;de clave&amp;quot; sean de un tipo para el que estén definidos los operadores relacionales. El contenedor es mantenido ordenado de forma automática por los algoritmos de inserción y borrado.&lt;br /&gt;
&lt;br /&gt;
La STL proporciona cinco tipo distintos, aunque en realidad son tres clases; dos de ellas en dos variedades (permitiendo o no claves duplicadas). Uno de los tipos (bitset) sirve para almacenar campos de bits de longitud constante. Los otros dos permiten elementos ordenados de cualquier tipo (set y multiset), mientras que map y multimap permiten alojar pares de elementos. Uno que actúa como &amp;quot;Key value&amp;quot; y otro que puede ser un tipo cualquiera al que llamaremos valor-dato.&lt;br /&gt;
&lt;br /&gt;
  • bitset&lt;br /&gt;
  • set&lt;br /&gt;
  • multiset&lt;br /&gt;
  • map&lt;br /&gt;
  • multimap&lt;br /&gt;
&lt;br /&gt;
Existen mecanismos para asociar un valor o dato de cualquier tipo con una clave; para encontrar el valor asociado a una clave, y para recorrer el conjunto (ordenado) de las claves.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
== Véase también  ==&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Constructor (C++)]]&lt;br /&gt;
*[[Ficheros en C++]]&lt;br /&gt;
*[[Facetas C++]]&lt;br /&gt;
*[[Librería Estándar C++]]&lt;br /&gt;
*[[Facetas C++]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|Programación C Sharp]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
*[[Code_Blocks]]&lt;br /&gt;
*[[Operadores|Operadores]] &lt;br /&gt;
*[[Tokens|Tokens]]&amp;lt;br&amp;gt; &lt;br /&gt;
*[[Identificadores|Identificadores]]&lt;br /&gt;
*[[Ámbito (Programación)|Ámbito (Programación)]]&lt;br /&gt;
*[[Enumeraciones (Informática)|Enumeraciones (Informática)]] &lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
&lt;br /&gt;
== Fuente  ==&lt;br /&gt;
* [http://http://www.zator.com/Cpp/E5_1_1.htm Contenerores C++]&lt;br /&gt;
* [http://c.conclase.net/curso/index.php  Contenedores en C.conclase.net]&lt;br /&gt;
* [https://docs.microsoft.com/es-es/cpp/standard-library/stl-containers?view=vs-2017  Contenedores de la biblioteca estándar de C++]&lt;br /&gt;
[[Category:Informática]] [[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Mayle</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=C%2B%2B&amp;diff=3234416</id>
		<title>C++</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=C%2B%2B&amp;diff=3234416"/>
		<updated>2018-11-29T19:48:07Z</updated>

		<summary type="html">&lt;p&gt;Mayle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=C++&lt;br /&gt;
|familia=Derivados de C&lt;br /&gt;
|imagen=C++.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Lenguaje de programación&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=Bjarne Stroustrup&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=1983&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos=Multiplataforma&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''C++''' es un lenguaje imperativo orientado a objetos derivado del C. En realidad un superconjunto de C, que nació para añadirle cualidades y características de las que carecía. El resultado es que como su ancestro, sigue muy ligado al hardware subyacente, manteniendo una considerable potencia para programación a bajo nivel, pero se la han añadido elementos que le permiten también un estilo de programación con alto nivel de abstracción. Estrictamente hablando, C no es un subconjunto de C++; de hecho es posible escribir código C que es ilegal en C++. Pero a efectos prácticos, dado el esfuerzo de compatibilidad desplegado en su diseño, puede considerarse que C++ es una extensión del C clásico. La definición &amp;quot;oficial&amp;quot; del lenguaje nos dice que C++ es un lenguaje de propósito general basado en el C, al que se han añadido nuevos tipos de datos, clases, plantillas, mecanismo de excepciones, sistema de espacios de nombres, funciones inline, sobrecarga de [[Operadores|operadores]], referencias, operadores para manejo de memoria persistente, y algunas utilidades adicionales de librería (en realidad la [[Librería|librería]] Estándar C es un subconjunto de la librería C++) &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Un Poco de historia  ==&lt;br /&gt;
&lt;br /&gt;
El comité para el estándar [[ANSI|ANSI]] [[C]] fue formado en [[1983]] con el objetivo de crear un lenguaje uniforme a partir del C original, desarrollado por Kernighan y Ritchie en 1972, en la ATT. Hasta entonces el estándar lo marcaba el libro escrito en 1978 por estos dos autores1. El lenguaje C++ se comenzó a desarrollar en 1980. Su autor fue [[Bjarne Stroustrup]], también de la ATT. Al comienzo era una extensión del lenguaje C que fue denominada C with classes. Este nuevo lenguaje comenzó a ser utilizado fuera de la ATT en [[1983]]. El nombre C++ es también de ese año, y hace referencia al carácter del operador incremento de C (++). Ante la gran difusión y éxito que iba obteniendo en el mundo de los programadores, la ATT comenzó a estandarizarlo internamente en [[1987]]. En [[1989]] se formó un comité ANSI (seguido algún tiempo después por un comité [[ISO|ISO]]) para estandarizarlo a nivel americano e internacional. En la actualidad, el C++ es un lenguaje versátil, potente y general. Su éxito entre los programadores profesionales le ha llevado a ocupar el primer puesto como herramienta de desarrollo de aplicaciones. El C++ mantiene las ventajas del C en cuanto a riqueza de [[Operadores|operadores]] y expresiones, flexibilidad, concisión y eficiencia. Además, ha eliminado algunas de las dificultades y limitaciones del C original. La evolución de C++ ha continuado con la aparición de [[Java]], un lenguaje creado simplificando algunas cosas de C++ y añadiendo otras, que se utiliza para realizar aplicaciones en Internet. Hay que señalar que el C++ ha influido en algunos puntos muy importantes del ANSI C, como por ejemplo en la forma de declarar las funciones, en los punteros a void, etc. En efecto, aunque el C++ es posterior al C, sus primeras versiones son anteriores al ANSI C, y algunas de las mejoras de éste fueron tomadas del C++. C++ es a la vez un lenguaje procedural (orientado a algoritmos) y orientado a objetos. Como lenguaje procedural se asemeja al C y es compatible con él, aunque ya se ha dicho que presenta ciertas ventajas. Como lenguaje orientado a objetos se basa en una filosofía completamente diferente, que exige del programador un completo cambio de mentalidad. Las características propias de la Programación Orientada a Objetos (Object Oriented Programming, u OOP) de C++ son modificaciones mayores que sí que cambian radicalmente su naturaleza.&lt;br /&gt;
&lt;br /&gt;
==Conceptos generales de la programación orientada a objetos== &lt;br /&gt;
&lt;br /&gt;
*Clase: Es una plantilla que define la      estructura  de un conjunto de objetos, que al ser creados se llamarán las       instancias de la clase. Esta estructura está compuesta por la definición       de los atributos y la implementación de las operaciones ( métodos  ). &lt;br /&gt;
&lt;br /&gt;
*Objeto: Es la      implementación de una instancia de  clase, es decir, una ocurrencia de      esta, que tiene los atributos  definidos por la clase, y sobre la que se      puede ejecutar las  operaciones definidas en ella. &lt;br /&gt;
&lt;br /&gt;
*Identidad:      Característica de cada objeto que lo  diferencia de los demás, incluyendo      de aquellos que pudieran  pertenecer a la misma clase y tener los mismos      valores en sus  atributos.&lt;br /&gt;
&lt;br /&gt;
*Herencia: Es      la capacidad que tienen las clases para heredar propiedades y métodos de      otras clases. &lt;br /&gt;
&lt;br /&gt;
== Acerca de la POO  ==&lt;br /&gt;
&lt;br /&gt;
La [[POO|POO]] es una nueva filosofía de programación que se basa en la utilización de objetos. El objetivo de la POO no es sino la meta de cualquier modelo de programación estructurada convencional: &amp;quot;imponer&amp;quot; una serie de normas de desarrollo que aseguren y faciliten la mantenibilidad y reusabilidad del código. Los mecanismos básicos de la POO son: objetos, mensajes, métodos y clases. &lt;br /&gt;
&lt;br /&gt;
*Objetos. Un objeto es una entidad que tiene unos atributos particulares (datos) y unas formas de operar sobre ellos (los métodos o funciones miembro). Es decir, un objeto incluye, por una parte una serie de operaciones que definen su comportamiento, y una serie de variables manipuladas por esas funciones que definen su estado. Por ejemplo, una ventana Windows contendrá operaciones como &amp;quot;maximizar&amp;quot; y variables como &amp;quot;ancho&amp;quot; y &amp;quot;alto&amp;quot; de la ventana. &lt;br /&gt;
*Mensajes. En C++, un mensaje se corresponde con el nombre de uno de los métodos de un objeto. Cuando se pasa un mensaje a un objeto, este responde ejecutando el código de la función asociada. &lt;br /&gt;
*[[Método|Método]]. Un método (función miembro) se implementa dentro de un objeto y determina como tiene que actuar el objeto cuando se produce el mensaje asociado. En C++ un método se corresponde con la definición de la función miembro del objeto. La estructura más interna de un objeto está oculta, de tal manera que la única conexión con el exterior son los mensajes &lt;br /&gt;
*Clases. Una clase es la definición de un tipo de objetos. De esta manera, una clase &amp;quot;Empleado&amp;quot; representaría todos los empleados de una empresa, mientras que un objeto de esa clase (también denominado instancia) representaría a uno de esos empleados en particular.&lt;br /&gt;
&lt;br /&gt;
Las principales características de la POO son: abstracción, encapsulamiento, herencia y polimorfismo: &lt;br /&gt;
&lt;br /&gt;
*[[Abstracción|Abstracción]]. Es el mecanismo de diseño en la POO. Nos permite extraer de un conjunto de entidades datos y comportamientos comunes para almacenarlos en clases. &lt;br /&gt;
*Encapsulamiento. Mediante esta técnica conseguiremos que cada clase sea una caja negra, de tal manera que los objetos de esa clase se puedan manipular como unidades básicas. Los detalles de la implementación se encuentran dentro de la clase, mientras que desde el exterior, un objeto será simplemente una entidad que responde a una serie de mensajes públicos (también denominados interfaz de la clase). &lt;br /&gt;
*Herencia. Es el mecanismo que nos permite crear clases derivadas (especialización) a partir de clases bases (generalización). Es decir, podríamos tener la clase &amp;quot;Empleado&amp;quot; (clase base) y la clase &amp;quot;Vendedor&amp;quot; derivando de la anterior. Una librería de clases (como la MFC) no es más que un conjunto de definiciones de clases interconectadas por múltiples relaciones de herencia. &lt;br /&gt;
*Polimorfismo. Esta característica nos permite disponer de múltiples implementaciones de un mismo método de clase, dependiendo de la clase en la que se realice. Es decir, podemos acceder a una variedad de métodos distintos (con el mismo nombre) mediante el mismo mecanismo de acceso. En C++ el polimorfismo se consigue mediante la definición de clases derivadas, funciones virtuales y el uso de punteros a objetos.&lt;br /&gt;
&lt;br /&gt;
Otros dos conceptos muy importantes en la POO son relativos a la creación y destrucción de objetos. En lenguajes estructurados convencionales, cuando se define una variable se le reserva espacio en memoria y, si no se inicializa expresamente, se hace por defecto (por ejemplo, en C una variable global siempre se inicializa a 0, pero una automática no, por lo que si no se inicializa expresamente su contenido inicial será basura); por otra parte, cuando se destruye una variable (por que se abandona el ámbito de su definición - scope -) se libera la memoria que estaba ocupando. Si ahora hacemos el paralelismo obligado entre variables y objetos para los lenguajes POO nos daremos cuenta de que deben existir procedimientos especiales de construcción y destrucción de objetos. En concreto, cada clase tiene dos funciones miembro especiales denominadas constructor y destructor. &lt;br /&gt;
&lt;br /&gt;
*[[Constructor (C++)|Constructor]] -&amp;amp;gt; Función miembro que es automáticamente invocada cada vez que se define un objeto, su objetivo es la inicialización del mismo. Toma el mismo nombre que la clase, puede recibir parámetros y podemos tener varios constructores definidos. &lt;br /&gt;
*[[Destructor|Destructor]] -&amp;amp;gt; Función miembro invocada automáticamente cada vez que se destruye un objeto. Su objetivo es realizar operaciones como liberación de memoria, cerrar ficheros abiertos, etc. Toma el mismo nombre de la clase comenzado primero por el carácter &amp;quot;~&amp;quot;, no toma parámetros y no admite la sobrecarga (sólo puede existir uno en cada clase).&lt;br /&gt;
&lt;br /&gt;
En muchos casos, para las clases mas sencillas, podemos encontrar clases que no tiene constructor o destructor, ó ninguno de los dos. En C++, siempre existen constructores y destructores por defecto que realizan una inicialización/liberación estándar.&lt;br /&gt;
&lt;br /&gt;
== Acerca de Intérprete y compiladores  ==&lt;br /&gt;
&lt;br /&gt;
Antes, mencionar que tanto C como C++ son lenguajes compilados, y no interpretados. Esta diferencia es muy importante, ya que afecta mucho a muchos aspectos relacionados con la ejecución del programa. En un lenguaje interpretado, el programa está escrito en forma de texto, es el propio programa fuente. Este programa fuente es procesado por un programa externo, el intérprete, que traduce el programa, instrucción a instrucción, al tiempo que lo ejecuta. En los lenguajes interpretados no existen programas ejecutables directamente por el ordenador. El intérprete traduce, en tiempo real, cada línea del programa fuente, cada vez que se quiere ejecutar el programa. El los lenguajes compilados el proceso de traducción sólo se hace una vez. El programa compilador toma como entrada el código fuente del programa, y da como salida un fichero que puede ser ejecutado por el ordenador directamente. Una vez compilado, el programa ejecutable es autónomo, y ya no es necesario disponer del programa original ni del compilador para ejecutarlo. Cada opción tiene sus ventajas e inconvenientes, y algunas características que son consideradas una ventaja, pueden ser un inconveniente en ciertas circunstancias, y viceversa. &lt;br /&gt;
&lt;br /&gt;
*Los lenguajes interpretados son fácilmente modificables, ya que necesitamos tener el el código fuente disponible en el ordenador. En los compilados, estos ficheros no son necesarios, una vez compilados. &lt;br /&gt;
*Los lenguajes interpretados necesitan un programa externo, llamado intérprete o a veces máquina virtual, o framework. Este programa actua como intermediario entre el fuente y el sistema operativo. En los compilados ese papel lo desempeña el compilador, pero al contrario que con el intérprete, una vez ha hecho su trabajo, no es necesario que esté presente para ejecutar el programa. &lt;br /&gt;
*Estas dos características, lógicamente, hacen que los programas compilados requieran menos espacio de memoria que los interpretados (si contamos el espacio usado por el intérprete), y en general, los compilados son más rápidos, ya que sólo se compilan una vez, y el tiempo dedicado a esa tarea no se suma al de ejecución.&lt;br /&gt;
&lt;br /&gt;
Entre los lenguajes interpretados están: [[BASIC|BASIC]] (Código de instrucciones de propósito general para principiantes), Java, [[PHP|PHP]]. Muchos lenguajes de script, etc. Entre los lenguajes compilados están: C, C++, Pascal. &lt;br /&gt;
&lt;br /&gt;
== Qué se puede hacer con C++  ==&lt;br /&gt;
&lt;br /&gt;
¿Qué clase de programas y aplicaciones se pueden crear usando C y C++? La respuesta es muy sencilla: TODOS. Tanto C como C++ son lenguajes de programación de propósito general. Todo puede programarse con ellos, desde sistemas operativos y compiladores hasta aplicaciones de bases de datos y procesadores de texto, pasando por juegos, aplicaciones a medida, etc. &lt;br /&gt;
&lt;br /&gt;
=== Un ejemplo de código  ===&lt;br /&gt;
&lt;br /&gt;
Este es el clásico programa hola mundo, la idea está centrada en el nacimiento de un nuevo programa de manos de su creador. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;Hola mundo&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ¿Qué se ha hecho en C o en C++?  ==&lt;br /&gt;
&lt;br /&gt;
=== Sistemas Operativos y otros programas ===&lt;br /&gt;
&lt;br /&gt;
*Así como Unix el antecesor de este sistema operativo, [[GNU/Linux]] -a menudo denominado tan sólo como [[Linux]], que es el nombre del núcleo del SO- hace uso de un buen número de lenguajes de programación en sus distintos componentes. ¿Cuáles son esos lenguajes? Cada tipo de recurso parece tener ciertas preferencias, y es que hay lenguajes más adecuados para unas cosas. Obviamente el lenguaje de programación C sigue siendo la base, pero hay mucho más implicados. &lt;br /&gt;
*Kernel y drivers de dispositivos: Tanto los drivers como el kernel funcionan en un nivel realmente bajo de operaciones en el ordenador. Para escribir el kernel del sistema operativo y acceder a las propiedades del hardware tales como los ciclos de la memoria, buses de entrada/salida, etc., se necesita un lenguaje que pueda comunicarse con el hardware con potencia. El kernel Linux hace uso del lenguaje C (aunque en realidad no se trate de un lenguaje de bajo nivel) con una pequeña parte en lenguaje ensamblador. &lt;br /&gt;
&lt;br /&gt;
*Librerías y utilidades: Las librerías y utilidades básicas del sistema tales como mkdir, chmod, chown, head, tail, chroot, uptime, users también están escritas en lenguaje C.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Gestores de paquetes y programas de configuración: Los gestores de paquetes tales como yum, apt, dpkg, etcétera, también están escritos en C, que como veis es la estrella absoluta de los componentes &amp;quot;base&amp;quot; de un sistema [[GNU/Linux]].&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Entornos de Escritorio y gestores de ventanas: La mayoría de gente usa un entorno de escritorio, y es que a día de hoy poco queda sólo en interfaz de línea de comandos. Los gestores de ventanas tales como metacity, kwin están desarrollados en C y requieren gcc para ser compilados. El entorno de escritorio, iconos, ventanas, barras de herramientas, etc, están basados en librerías específicas (Qt para KDE, GTK+ para GNOME) y hacen uso del lenguaje mayoritario, C.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Aplicaciones gráficas de usuario: Este es el punto donde entran en juego una gran cantidad de lenguajes de programación, dado que básicamente es la capa más alta. Tenemos una gran variedad: C, Python, Java, Perl y otros. Hay librerías GTK+, Tcl/Tk, Qt que son un frontend gráfico a tareas que corren por detrás en línea de comando.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*El Sistema operativo [[Windows]] está hecho básicamente en C, C tiene la ventaja de que puede escalarse con ensamblador, lo cual es buena opción para optimizar ciertos módulos.&lt;br /&gt;
&lt;br /&gt;
Las versiones anteriores de Windows estaban hechas en Basic (Basic NO visual Basic) que es un lenguaje de bajo nivel de hace unos cuantos años ya. Es un lenguaje que se usa mucho en la electrónica aun. &lt;br /&gt;
&lt;br /&gt;
*Actualmente Windows 7 Mac os x Leopard y [[Linux]] usan mas de una Tecnología ya se empezó a usar [[Lenguaje de Programación C Sharp|c#]] c++ y hasta java en el caso de linux se usa phytom c y tbn ensambladores y demás cosas, y Mac siempre basado en Unix con compilación en C++ para los últimos Sistemas Operativos.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
&lt;br /&gt;
*[[Ciencia de la Información]]&lt;br /&gt;
*[[Puntero (C++)]]&lt;br /&gt;
*[[Librería Estándar C++]]&lt;br /&gt;
*[[Facetas C++]]&lt;br /&gt;
*[[Contenedores C++]]&lt;br /&gt;
*[[Constructor (C++)]]&lt;br /&gt;
*[[Ficheros en C++]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|Programación C Sharp]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
*[[Code_Blocks]]&lt;br /&gt;
&lt;br /&gt;
== Fuentes  ==&lt;br /&gt;
&lt;br /&gt;
*[http://mat21.etsii.upm.es/ayudainf/aprendainf/Cpp/manualcpp.pdf Manual C++]&lt;br /&gt;
*[http://www.monografias.com/trabajos5/visualcurso/visualcurso.shtml Curso Visual]&lt;br /&gt;
*[http://www.zator.com/Cpp/E1_2.htm C++]&lt;br /&gt;
*[http://es.wikipedia.org/wiki/C%2B%2B C++ en Wikipedia]&lt;br /&gt;
*[http://www.programacionfacil.com/cpp:informacion_y_conocimiento C++ en ProgramacionFacil.com]&lt;br /&gt;
*[http://www.somoslibres.org/modules.php?name=News&amp;amp;file=article&amp;amp;sid=2708 C++ en SomosLibres.org]&lt;br /&gt;
*[http://www.psicofxp.com/forums/programacion.313/374200-c-y-sistemas-operativos.html El C++ y los Sistemas Operativos]&lt;br /&gt;
*[http://es.kioskea.net/forum/affich-101630-lenguaje-en-que-fue-escrito-windows Windows está escrito en C++]&lt;br /&gt;
&lt;br /&gt;
[[Category:Programación]][[Category:Informática]]&lt;br /&gt;
[[Category:Lenguajes_de_programación_orientada_a_objetos]]&lt;br /&gt;
[[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Mayle</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Facetas_C%2B%2B&amp;diff=3234414</id>
		<title>Facetas C++</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Facetas_C%2B%2B&amp;diff=3234414"/>
		<updated>2018-11-29T19:46:59Z</updated>

		<summary type="html">&lt;p&gt;Mayle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;{{Definición|Nombre= Facetas C++ |imagen=  |concepto= Las facetas [[C++|C++]] son clases muy flexibles (en realidad clases genéricas); también pueden ser definidas por el usuario o ser adquirida a terceros en forma de librería. Lo mismo que ocurría con los localismos C, las facet también se clasifican en seis categorías, y aunque en este caso los nombres no corresponden a constantes manifiestas, también corresponden a constantes enteras que rememoran muy de cerca los nombres utilizados en C : numeric; time; monetary; ctype;  collate y message}}&lt;br /&gt;
La información y su manipulación, que en el caso de C está contenida en estructuras y en [[Función (programación)|funciones]] globales, ha sido sustituida en [[C++|C++]] por unas clases denominadas facetas (&amp;quot;Facets&amp;quot;) que derivan de una superclase facet.&lt;br /&gt;
Un objeto facet  puede contener prácticamente cualquier aspecto de internacionalización. Por ejemplo, el formato y símbolo de valores monetarios; los de fecha, Etc.  le proporciona un par de docenas de estas clases que proporcionan servicios similares a los proporcionados por la [[Librería Estándar C++|librería Estándar C]]. Un facet encapsula la información local que en C está englobada en una categoría CL_..., aunque de forma más especializada. Por ejemplo, la funcionalidad contenida en la categoría LC_NUMERIC está dispersa en 4 facetas:&lt;br /&gt;
  template &amp;lt;class charT&amp;gt; class numpunct;&lt;br /&gt;
  template &amp;lt;class charT&amp;gt; class numpunct_byname;&lt;br /&gt;
  template &amp;lt;class charT, class InputIterator &amp;gt; class num_get;&lt;br /&gt;
  template &amp;lt;class charT, class OutputIterator&amp;gt; class num_put;&lt;br /&gt;
De estas clases existen espacializaciones para los tipos char y wchar_t, de forma que existen las siguientes:&lt;br /&gt;
&lt;br /&gt;
 numpunct&amp;lt;char&amp;gt;&lt;br /&gt;
 numpunct&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
 numpunct_byname&amp;lt;char&amp;gt;&lt;br /&gt;
 numpunct_byname&amp;lt;wchar_t&amp;gt;	num_get&amp;lt;char&amp;gt;&lt;br /&gt;
 num_get&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
 num_put&amp;lt;char&amp;gt;&lt;br /&gt;
 num_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
== Clasificación ==&lt;br /&gt;
Las facetas C++ se clasifican en seis categorías básicas representadas por constantes enteras cuyos nombres son los indicados.  Aunque también pueden pertenecer a cualquier combinación de bits entre ellas. Dos de estas combinaciones tienen nombres específicos:  none (ninguna) y all (todas).&lt;br /&gt;
Los valores particulares asignados a estas constantes dependen de la implementación. A título de ejemplo mostramos un conjunto de valores posibles:&lt;br /&gt;
&lt;br /&gt;
 // Nombre Valor    Patrón de bits&lt;br /&gt;
 collate  = 1;      // 00000001&lt;br /&gt;
 ctype    = 2;      // 00000010&lt;br /&gt;
 monetary = 4;      // 00000100&lt;br /&gt;
 numeric  = 8;      // 00001000&lt;br /&gt;
 time     = 16;     // 00010000&lt;br /&gt;
 messages = 32;     // 00100000&lt;br /&gt;
 Aparte de las dos combinaciones con nombre propio:&lt;br /&gt;
 none     = 0;      // 00000000&lt;br /&gt;
 all      = 63      // 00111111&lt;br /&gt;
&lt;br /&gt;
Puede existir cualquier otro tipo que sea combinación de los anteriores y que se identificaría por su valor. Por ejemplo, el valor 12 correspondería al tipo numeric-monetary, y el valor 9 al tipo collate-numeric-monetary.  Observe que el tipo all puede definirse como:&lt;br /&gt;
&lt;br /&gt;
 all = (collate | ctype | monetary | numeric | time | message );&lt;br /&gt;
== Las facetas estándar ==&lt;br /&gt;
A continuación se incluye una breve descripción de las categorías básicas. Observe que en realidad las facet estándar son clases genéricas. En la descripción que sigue, una expresión como num_get&amp;lt;charT,InputIterator&amp;gt; significa que la faceta num_get es una plantilla que acepta dos argumentos:  un tipo carácter (charT) y un iterador de entrada.  Observe que muchas de las facetas estándar están desdobladas en dos clases que aceptan respectivamente iteradores de entrada y de salida, según el tipo de operación que soportan.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Categoría&lt;br /&gt;
! Facetas incluidas&lt;br /&gt;
|-&lt;br /&gt;
| numeric&lt;br /&gt;
| numpunct&amp;lt;char&amp;gt;&lt;br /&gt;
num_get&amp;lt;char&amp;gt;&lt;br /&gt;
num_put&amp;lt;char&amp;gt;&lt;br /&gt;
| numpunct&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
num_get&amp;lt;wchar_t&amp;gt; &lt;br /&gt;
num_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| time&lt;br /&gt;
| time_get&amp;lt;char&amp;gt;&lt;br /&gt;
time_put&amp;lt;char&amp;gt;&lt;br /&gt;
| time_get&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
time_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| monetary&lt;br /&gt;
| moneypunct&amp;lt;char&amp;gt;&lt;br /&gt;
moneypunct&amp;lt;char,true&amp;gt;&lt;br /&gt;
&lt;br /&gt;
money_get&amp;lt;char&amp;gt;&lt;br /&gt;
&lt;br /&gt;
money_put&amp;lt;char&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| moneypunct&amp;lt;wchar_t&amp;gt; &lt;br /&gt;
&lt;br /&gt;
moneypunct&amp;lt;wchar_t,true&amp;gt;&lt;br /&gt;
&lt;br /&gt;
money_get&amp;lt;wchar_t&amp;gt; &lt;br /&gt;
&lt;br /&gt;
money_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ctype&lt;br /&gt;
| ctype&amp;lt;char&amp;gt;&lt;br /&gt;
codecvt&amp;lt;char,char,mbstate_t&amp;gt;&lt;br /&gt;
| ctype&amp;lt;wchar_t&amp;gt; &lt;br /&gt;
codecvt&amp;lt;wchar_t,char,mbstate_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| collate&lt;br /&gt;
| collate&amp;lt;char&amp;gt;&lt;br /&gt;
| collate&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| messages&lt;br /&gt;
| messages&amp;lt;char&amp;gt;&lt;br /&gt;
| messages&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Numeric ===&lt;br /&gt;
Las facetas num_get&amp;lt;charT, InputIterator&amp;gt; y num_put&amp;lt;charT, OutputIterator&amp;gt; manejan el formateo numérico. Estas clases disponen de métodos get() y put() en versiones para los tipos long, double, etc. La faceta numpunct&amp;lt;charT&amp;gt; especifica la puntuación de los formatos numéricos. Para ello dispone de métodos como decimal_point(), thousands_sep(), etc.&lt;br /&gt;
=== Time ===&lt;br /&gt;
Las clases time_get&amp;lt;charT, InputIterator&amp;gt; y time_put&amp;lt;charT, OutputIterator&amp;gt; manejan los localismos relativos a fecha y hora.  Disponen de métodos como get_time(), get_date(), get_weekday(), etc.&lt;br /&gt;
=== Monetary ===&lt;br /&gt;
Las clases money_get&amp;lt;charT, InputIterator&amp;gt; y money_put&amp;lt;charT, OutputIterator&amp;gt; manejan los localismos monetarios. Disponen de métodos get() y put() cuya finalidad es respectivamente analizar o generar una secuencia de dígitos representando una cantidad en fracción monetaria más pequeña la moneda correspondiente. Por ejemplo: la secuencia $1,056.23 en un localismo estándar USA puede traducirse en el número 105623 (centavos de Dolar USA) o en la cadena de caracteres &amp;quot;105623&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La plantilla moneypunct&amp;lt;charT, bool&amp;gt; asume con las cantidades monetarias un papel análogo al de la clase numpunct&amp;lt;charT&amp;gt; con los formatos numéricos. Dispone de métodos como curr_symbol(), etc.&lt;br /&gt;
=== Ctype ===&lt;br /&gt;
La clase ctype&amp;lt;charT&amp;gt; encapsula las funcionalidades de clasificación de caracteres mediante métodos como tolower(), toupper(), isspace(), isprint(), etc.  La faceta codecvt&amp;lt;internT, externT, stateT&amp;gt; permite la conversión entre distintos sistemas de codificación. Por ejemplo, del sistema JIS a Unicode.  Sus métodos principales son in() y out(). Existe una especialización de esta plantilla codecvt&amp;lt;wchar_t, char, mbstate_t&amp;gt; que realiza conversiones de sistema multibyte a caracteres anchos.&lt;br /&gt;
=== Collate ===&lt;br /&gt;
La clase collate&amp;lt;charT&amp;gt; permite operaciones de ordenación y comparación de cadenas de caracteres, mediante métodos como compare(), hash() o transform().&lt;br /&gt;
=== Messages ===&lt;br /&gt;
La faceta messages&amp;lt;charT&amp;gt; implementa la especificación del consorcio X/Open para inclusión de mensajes en los programas (recordemos que la internacionalización aconseja mantener los mensajes fuera del cuerpo del ejecutable. Dispone de funciones del tipo open() y close() para mantener catálogos de mensajes.  También para recuperarlos individualmente mediante funciones como get(..., int msgid,...).&lt;br /&gt;
==  Acceder a los locales ==&lt;br /&gt;
Una interesante característica de los locales es la forma en que se acceden sus facetas. Esto no se realiza como cabría esperar mediante un método de la clase locale, sino mediante un par de funciones externas (definidas en la cabecera &amp;lt;locale&amp;gt;), que aceptan un locale como argumento. Es posible determinar si un objeto determinado contiene una faceta mediante la función has_facet(). A su vez la función use_facet() devuelve una referencia a la faceta para que pueda ser utilizada.&lt;br /&gt;
&lt;br /&gt;
Como la mayoría de entidades de la LE, ambas funciones (en realidad son funciones genéricas), están definidas en el subespacio std.&lt;br /&gt;
=== use_facet() ===&lt;br /&gt;
Prototipo&lt;br /&gt;
 template &amp;lt;class Facet&amp;gt; const Facet&amp;amp; use_facet(const locale&amp;amp; loc);&lt;br /&gt;
Este método devuelve una referencia a la faceta Facet señalada en el argumento de la plantilla. La faceta se especifica incluyéndola explícitamente en el argumento de la plantilla (ver ejemplo). Si el tipo señalado por Facet no está presente en el objeto loc, (o en su defecto, en el locale gobal), la función lanza una excepción bad_cast  en caso contrario devuelve una referencia a la faceta, que permanece válida mientras exista una copia del locale loc utilizado.&lt;br /&gt;
Ejemplo (sin incluir ningún dispositivo de control de las posibles excepciones):&lt;br /&gt;
 #include &amp;lt;locale&amp;gt;&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt; using namespace std;&lt;br /&gt;
  &lt;br /&gt;
 int main () {       // ==========&lt;br /&gt;
    locale loc;&lt;br /&gt;
    const ctype&amp;lt;char&amp;gt;&amp;amp; ct = use_facet&amp;lt;ctype&amp;lt;char&amp;gt; &amp;gt;(loc); // M2:&lt;br /&gt;
    cout &amp;lt;&amp;lt; 'a' &amp;lt;&amp;lt; ct.toupper('c') &amp;lt;&amp;lt; endl;     // -&amp;gt; aC&lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
En este caso se construye una referencia ct a la faceta ctype  para los tipos char y se inicia con el valor devuelto por la función use_facet.  A continuación se utiliza el método toupper() del objeto ct para transformar un carácter minúscula a mayúscula.&lt;br /&gt;
&lt;br /&gt;
Observe el espacio entre los símbolos &amp;gt;&amp;gt; de la sentencia M2, que es necesario para que el compilador pueda distinguirlos del operador &amp;gt;&amp;gt;.  Esta invocación de la función genérica use_facet utiliza la sintaxis que hemos denominado instanciación implícita específica.&lt;br /&gt;
&lt;br /&gt;
De los tres compiladores probados:  Borland C++ 5.5;  MS Visual C++ 6.0 y GNU cpp 2.95.2, solo el de Borland compila el ejemplo sin problemas.  El manual Borland señala que si el compilador no soporta este tipo de instanciación específica (una característica relativamente nueva del lenguaje que no está totalmente implementada en muchos compiladores), es preciso utilizar una sintaxis alternativa, correspondiente a una versión sobrecargada de la anterior que si puede ser soportada por el compilador:&lt;br /&gt;
&lt;br /&gt;
 template &amp;lt;class Facet&amp;gt; const Facet&amp;amp; use_facet(const locale&amp;amp; loc, Facet* pf);&lt;br /&gt;
&lt;br /&gt;
En este supuesto, la sentencia M2 del ejemplo quedaría como sigue:&lt;br /&gt;
&lt;br /&gt;
 const ctype&amp;lt;char&amp;gt;&amp;amp; ct = use_facet(loc,(ctype&amp;lt;char&amp;gt;*)0);&lt;br /&gt;
&lt;br /&gt;
Obsérvese que como segundo argumento se pasa un puntero nulo (valor 0) al que se ha aplicado un modelado  para adaptarlo al tipo esperado por esta nueva versión de use_facet.&lt;br /&gt;
=== has_facet() ===&lt;br /&gt;
Prototipo:&lt;br /&gt;
 template &amp;lt;class Facet&amp;gt; bool has_facet(const locale&amp;amp;) throw();&lt;br /&gt;
Esta función permite establecer si un locale tiene un tipo determinado de faceta. Devuelve cierto (true) en caso afirmativo, y falso (flase) en caso contrario. Como en el caso anterior, la instanciación debe realizarse con indicación explícita del tipo a utilizar por la plantilla.&lt;br /&gt;
Ejemplo:&lt;br /&gt;
 #include &amp;lt;locale&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 using namespace std; &lt;br /&gt;
 cout &amp;lt;&amp;lt; ((has_facet&amp;lt;ctype&amp;lt;char&amp;gt; &amp;gt;(L1)) ? &amp;quot;Si&amp;quot; : &amp;quot;NO&amp;quot;) &amp;lt;&amp;lt; endl; // -&amp;gt; Si&lt;br /&gt;
 &amp;lt;/div&amp;gt; &lt;br /&gt;
== Véase también  ==&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Constructor (C++)]]&lt;br /&gt;
*[[Contenedores  C++]]&lt;br /&gt;
*[[Librería Estándar C++]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|Programación C Sharp]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
*[[Code_Blocks]]&lt;br /&gt;
*[[Operadores|Operadores]] &lt;br /&gt;
*[[Tokens|Tokens]]&amp;lt;br&amp;gt; &lt;br /&gt;
*[[Identificadores|Identificadores]]&lt;br /&gt;
*[[Ámbito (Programación)|Ámbito (Programación)]]&lt;br /&gt;
*[[Enumeraciones (Informática)|Enumeraciones (Informática)]] &lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
&lt;br /&gt;
== Fuente  ==&lt;br /&gt;
* [http://http://www.zator.com/Cpp/E5_2_1.htm Facetas C++]&lt;br /&gt;
* [http://c.conclase.net/curso/index.php  Facetas en C.conclase.net]&lt;br /&gt;
* [https://docs.microsoft.com/es-es/cpp/?view=vs-2017 Clase facet]&lt;br /&gt;
[[Category:Informática]] [[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Mayle</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Facetas_C%2B%2B&amp;diff=3234413</id>
		<title>Facetas C++</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Facetas_C%2B%2B&amp;diff=3234413"/>
		<updated>2018-11-29T19:44:57Z</updated>

		<summary type="html">&lt;p&gt;Mayle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;{{Definición|Nombre= Facetas C++ |imagen=  |concepto= Las facetas [[C++|C++]] son clases muy flexibles (en realidad clases genéricas); también pueden ser definidas por el usuario o ser adquirida a terceros en forma de librería. Lo mismo que ocurría con los localismos C, las facet también se clasifican en seis categorías, y aunque en este caso los nombres no corresponden a constantes manifiestas, también corresponden a constantes enteras que rememoran muy de cerca los nombres utilizados en C : numeric; time; monetary; ctype;  collate y message}}&lt;br /&gt;
La información y su manipulación, que en el caso de C está contenida en estructuras y en [[Función (programación)|funciones]] globales, ha sido sustituida en [[C++|C++]] por unas clases denominadas facetas (&amp;quot;Facets&amp;quot;) que derivan de una superclase facet.&lt;br /&gt;
Un objeto facet  puede contener prácticamente cualquier aspecto de internacionalización. Por ejemplo, el formato y símbolo de valores monetarios; los de fecha, Etc.  le proporciona un par de docenas de estas clases que proporcionan servicios similares a los proporcionados por la [[Librería Estándar C++|librería Estándar C]]. Un facet encapsula la información local que en C está englobada en una categoría CL_..., aunque de forma más especializada. Por ejemplo, la funcionalidad contenida en la categoría LC_NUMERIC está dispersa en 4 facetas:&lt;br /&gt;
  template &amp;lt;class charT&amp;gt; class numpunct;&lt;br /&gt;
  template &amp;lt;class charT&amp;gt; class numpunct_byname;&lt;br /&gt;
  template &amp;lt;class charT, class InputIterator &amp;gt; class num_get;&lt;br /&gt;
  template &amp;lt;class charT, class OutputIterator&amp;gt; class num_put;&lt;br /&gt;
De estas clases existen espacializaciones para los tipos char y wchar_t, de forma que existen las siguientes:&lt;br /&gt;
&lt;br /&gt;
 numpunct&amp;lt;char&amp;gt;&lt;br /&gt;
 numpunct&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
 numpunct_byname&amp;lt;char&amp;gt;&lt;br /&gt;
 numpunct_byname&amp;lt;wchar_t&amp;gt;	num_get&amp;lt;char&amp;gt;&lt;br /&gt;
 num_get&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
 num_put&amp;lt;char&amp;gt;&lt;br /&gt;
 num_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
== Clasificación ==&lt;br /&gt;
Las facetas C++ se clasifican en seis categorías básicas representadas por constantes enteras cuyos nombres son los indicados.  Aunque también pueden pertenecer a cualquier combinación de bits entre ellas. Dos de estas combinaciones tienen nombres específicos:  none (ninguna) y all (todas).&lt;br /&gt;
Los valores particulares asignados a estas constantes dependen de la implementación. A título de ejemplo mostramos un conjunto de valores posibles:&lt;br /&gt;
&lt;br /&gt;
 // Nombre Valor    Patrón de bits&lt;br /&gt;
 collate  = 1;      // 00000001&lt;br /&gt;
 ctype    = 2;      // 00000010&lt;br /&gt;
 monetary = 4;      // 00000100&lt;br /&gt;
 numeric  = 8;      // 00001000&lt;br /&gt;
 time     = 16;     // 00010000&lt;br /&gt;
 messages = 32;     // 00100000&lt;br /&gt;
 Aparte de las dos combinaciones con nombre propio:&lt;br /&gt;
 none     = 0;      // 00000000&lt;br /&gt;
 all      = 63      // 00111111&lt;br /&gt;
&lt;br /&gt;
Puede existir cualquier otro tipo que sea combinación de los anteriores y que se identificaría por su valor. Por ejemplo, el valor 12 correspondería al tipo numeric-monetary, y el valor 9 al tipo collate-numeric-monetary.  Observe que el tipo all puede definirse como:&lt;br /&gt;
&lt;br /&gt;
 all = (collate | ctype | monetary | numeric | time | message );&lt;br /&gt;
== Las facetas estándar ==&lt;br /&gt;
A continuación se incluye una breve descripción de las categorías básicas. Observe que en realidad las facet estándar son clases genéricas. En la descripción que sigue, una expresión como num_get&amp;lt;charT,InputIterator&amp;gt; significa que la faceta num_get es una plantilla que acepta dos argumentos:  un tipo carácter (charT) y un iterador de entrada.  Observe que muchas de las facetas estándar están desdobladas en dos clases que aceptan respectivamente iteradores de entrada y de salida, según el tipo de operación que soportan.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Categoría&lt;br /&gt;
! Facetas incluidas&lt;br /&gt;
|-&lt;br /&gt;
| numeric&lt;br /&gt;
| numpunct&amp;lt;char&amp;gt;&lt;br /&gt;
num_get&amp;lt;char&amp;gt;&lt;br /&gt;
num_put&amp;lt;char&amp;gt;&lt;br /&gt;
| numpunct&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
num_get&amp;lt;wchar_t&amp;gt; &lt;br /&gt;
num_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| time&lt;br /&gt;
| time_get&amp;lt;char&amp;gt;&lt;br /&gt;
time_put&amp;lt;char&amp;gt;&lt;br /&gt;
| time_get&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
time_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| monetary&lt;br /&gt;
| moneypunct&amp;lt;char&amp;gt;&lt;br /&gt;
moneypunct&amp;lt;char,true&amp;gt;&lt;br /&gt;
money_get&amp;lt;char&amp;gt;&lt;br /&gt;
money_put&amp;lt;char&amp;gt;&lt;br /&gt;
| moneypunct&amp;lt;wchar_t&amp;gt; &lt;br /&gt;
moneypunct&amp;lt;wchar_t,true&amp;gt;&lt;br /&gt;
money_get&amp;lt;wchar_t&amp;gt; &lt;br /&gt;
money_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ctype&lt;br /&gt;
| ctype&amp;lt;char&amp;gt;&lt;br /&gt;
codecvt&amp;lt;char,char,mbstate_t&amp;gt;&lt;br /&gt;
| ctype&amp;lt;wchar_t&amp;gt; &lt;br /&gt;
codecvt&amp;lt;wchar_t,char,mbstate_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| collate&lt;br /&gt;
| collate&amp;lt;char&amp;gt;&lt;br /&gt;
| collate&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| messages&lt;br /&gt;
| messages&amp;lt;char&amp;gt;&lt;br /&gt;
| messages&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Numeric ===&lt;br /&gt;
Las facetas num_get&amp;lt;charT, InputIterator&amp;gt; y num_put&amp;lt;charT, OutputIterator&amp;gt; manejan el formateo numérico. Estas clases disponen de métodos get() y put() en versiones para los tipos long, double, etc. La faceta numpunct&amp;lt;charT&amp;gt; especifica la puntuación de los formatos numéricos. Para ello dispone de métodos como decimal_point(), thousands_sep(), etc.&lt;br /&gt;
=== Time ===&lt;br /&gt;
Las clases time_get&amp;lt;charT, InputIterator&amp;gt; y time_put&amp;lt;charT, OutputIterator&amp;gt; manejan los localismos relativos a fecha y hora.  Disponen de métodos como get_time(), get_date(), get_weekday(), etc.&lt;br /&gt;
=== Monetary ===&lt;br /&gt;
Las clases money_get&amp;lt;charT, InputIterator&amp;gt; y money_put&amp;lt;charT, OutputIterator&amp;gt; manejan los localismos monetarios. Disponen de métodos get() y put() cuya finalidad es respectivamente analizar o generar una secuencia de dígitos representando una cantidad en fracción monetaria más pequeña la moneda correspondiente. Por ejemplo: la secuencia $1,056.23 en un localismo estándar USA puede traducirse en el número 105623 (centavos de Dolar USA) o en la cadena de caracteres &amp;quot;105623&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La plantilla moneypunct&amp;lt;charT, bool&amp;gt; asume con las cantidades monetarias un papel análogo al de la clase numpunct&amp;lt;charT&amp;gt; con los formatos numéricos. Dispone de métodos como curr_symbol(), etc.&lt;br /&gt;
=== Ctype ===&lt;br /&gt;
La clase ctype&amp;lt;charT&amp;gt; encapsula las funcionalidades de clasificación de caracteres mediante métodos como tolower(), toupper(), isspace(), isprint(), etc.  La faceta codecvt&amp;lt;internT, externT, stateT&amp;gt; permite la conversión entre distintos sistemas de codificación. Por ejemplo, del sistema JIS a Unicode.  Sus métodos principales son in() y out(). Existe una especialización de esta plantilla codecvt&amp;lt;wchar_t, char, mbstate_t&amp;gt; que realiza conversiones de sistema multibyte a caracteres anchos.&lt;br /&gt;
=== Collate ===&lt;br /&gt;
La clase collate&amp;lt;charT&amp;gt; permite operaciones de ordenación y comparación de cadenas de caracteres, mediante métodos como compare(), hash() o transform().&lt;br /&gt;
=== Messages ===&lt;br /&gt;
La faceta messages&amp;lt;charT&amp;gt; implementa la especificación del consorcio X/Open para inclusión de mensajes en los programas (recordemos que la internacionalización aconseja mantener los mensajes fuera del cuerpo del ejecutable. Dispone de funciones del tipo open() y close() para mantener catálogos de mensajes.  También para recuperarlos individualmente mediante funciones como get(..., int msgid,...).&lt;br /&gt;
==  Acceder a los locales ==&lt;br /&gt;
Una interesante característica de los locales es la forma en que se acceden sus facetas. Esto no se realiza como cabría esperar mediante un método de la clase locale, sino mediante un par de funciones externas (definidas en la cabecera &amp;lt;locale&amp;gt;), que aceptan un locale como argumento. Es posible determinar si un objeto determinado contiene una faceta mediante la función has_facet(). A su vez la función use_facet() devuelve una referencia a la faceta para que pueda ser utilizada.&lt;br /&gt;
&lt;br /&gt;
Como la mayoría de entidades de la LE, ambas funciones (en realidad son funciones genéricas), están definidas en el subespacio std.&lt;br /&gt;
=== use_facet() ===&lt;br /&gt;
Prototipo&lt;br /&gt;
 template &amp;lt;class Facet&amp;gt; const Facet&amp;amp; use_facet(const locale&amp;amp; loc);&lt;br /&gt;
Este método devuelve una referencia a la faceta Facet señalada en el argumento de la plantilla. La faceta se especifica incluyéndola explícitamente en el argumento de la plantilla (ver ejemplo). Si el tipo señalado por Facet no está presente en el objeto loc, (o en su defecto, en el locale gobal), la función lanza una excepción bad_cast  en caso contrario devuelve una referencia a la faceta, que permanece válida mientras exista una copia del locale loc utilizado.&lt;br /&gt;
Ejemplo (sin incluir ningún dispositivo de control de las posibles excepciones):&lt;br /&gt;
 #include &amp;lt;locale&amp;gt;&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt; using namespace std;&lt;br /&gt;
  &lt;br /&gt;
 int main () {       // ==========&lt;br /&gt;
    locale loc;&lt;br /&gt;
    const ctype&amp;lt;char&amp;gt;&amp;amp; ct = use_facet&amp;lt;ctype&amp;lt;char&amp;gt; &amp;gt;(loc); // M2:&lt;br /&gt;
    cout &amp;lt;&amp;lt; 'a' &amp;lt;&amp;lt; ct.toupper('c') &amp;lt;&amp;lt; endl;     // -&amp;gt; aC&lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
En este caso se construye una referencia ct a la faceta ctype  para los tipos char y se inicia con el valor devuelto por la función use_facet.  A continuación se utiliza el método toupper() del objeto ct para transformar un carácter minúscula a mayúscula.&lt;br /&gt;
&lt;br /&gt;
Observe el espacio entre los símbolos &amp;gt;&amp;gt; de la sentencia M2, que es necesario para que el compilador pueda distinguirlos del operador &amp;gt;&amp;gt;.  Esta invocación de la función genérica use_facet utiliza la sintaxis que hemos denominado instanciación implícita específica.&lt;br /&gt;
&lt;br /&gt;
De los tres compiladores probados:  Borland C++ 5.5;  MS Visual C++ 6.0 y GNU cpp 2.95.2, solo el de Borland compila el ejemplo sin problemas.  El manual Borland señala que si el compilador no soporta este tipo de instanciación específica (una característica relativamente nueva del lenguaje que no está totalmente implementada en muchos compiladores), es preciso utilizar una sintaxis alternativa, correspondiente a una versión sobrecargada de la anterior que si puede ser soportada por el compilador:&lt;br /&gt;
&lt;br /&gt;
 template &amp;lt;class Facet&amp;gt; const Facet&amp;amp; use_facet(const locale&amp;amp; loc, Facet* pf);&lt;br /&gt;
&lt;br /&gt;
En este supuesto, la sentencia M2 del ejemplo quedaría como sigue:&lt;br /&gt;
&lt;br /&gt;
 const ctype&amp;lt;char&amp;gt;&amp;amp; ct = use_facet(loc,(ctype&amp;lt;char&amp;gt;*)0);&lt;br /&gt;
&lt;br /&gt;
Obsérvese que como segundo argumento se pasa un puntero nulo (valor 0) al que se ha aplicado un modelado  para adaptarlo al tipo esperado por esta nueva versión de use_facet.&lt;br /&gt;
=== has_facet() ===&lt;br /&gt;
Prototipo:&lt;br /&gt;
 template &amp;lt;class Facet&amp;gt; bool has_facet(const locale&amp;amp;) throw();&lt;br /&gt;
Esta función permite establecer si un locale tiene un tipo determinado de faceta. Devuelve cierto (true) en caso afirmativo, y falso (flase) en caso contrario. Como en el caso anterior, la instanciación debe realizarse con indicación explícita del tipo a utilizar por la plantilla.&lt;br /&gt;
Ejemplo:&lt;br /&gt;
 #include &amp;lt;locale&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 using namespace std; &lt;br /&gt;
 cout &amp;lt;&amp;lt; ((has_facet&amp;lt;ctype&amp;lt;char&amp;gt; &amp;gt;(L1)) ? &amp;quot;Si&amp;quot; : &amp;quot;NO&amp;quot;) &amp;lt;&amp;lt; endl; // -&amp;gt; Si&lt;br /&gt;
 &amp;lt;/div&amp;gt; &lt;br /&gt;
== Véase también  ==&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Constructor (C++)]]&lt;br /&gt;
*[[Contenedores  C++]]&lt;br /&gt;
*[[Librería Estándar C++]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|Programación C Sharp]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
*[[Code_Blocks]]&lt;br /&gt;
*[[Operadores|Operadores]] &lt;br /&gt;
*[[Tokens|Tokens]]&amp;lt;br&amp;gt; &lt;br /&gt;
*[[Identificadores|Identificadores]]&lt;br /&gt;
*[[Ámbito (Programación)|Ámbito (Programación)]]&lt;br /&gt;
*[[Enumeraciones (Informática)|Enumeraciones (Informática)]] &lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
&lt;br /&gt;
== Fuente  ==&lt;br /&gt;
* [http://http://www.zator.com/Cpp/E5_2_1.htm Facetas C++]&lt;br /&gt;
* [http://c.conclase.net/curso/index.php  Facetas en C.conclase.net]&lt;br /&gt;
* [https://docs.microsoft.com/es-es/cpp/?view=vs-2017 Clase facet]&lt;br /&gt;
[[Category:Informática]] [[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Mayle</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Facetas_C%2B%2B&amp;diff=3234400</id>
		<title>Facetas C++</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Facetas_C%2B%2B&amp;diff=3234400"/>
		<updated>2018-11-29T19:33:03Z</updated>

		<summary type="html">&lt;p&gt;Mayle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;{{Definición|Nombre= Facetas C++ |imagen=  |concepto= Las facetas [[C++|C++]] son clases muy flexibles (en realidad clases genéricas); también pueden ser definidas por el usuario o ser adquirida a terceros en forma de librería. Lo mismo que ocurría con los localismos C, las facet también se clasifican en seis categorías, y aunque en este caso los nombres no corresponden a constantes manifiestas, también corresponden a constantes enteras que rememoran muy de cerca los nombres utilizados en C : numeric; time; monetary; ctype;  collate y message}}&lt;br /&gt;
La información y su manipulación, que en el caso de C está contenida en estructuras y en [[Función (programación)|funciones]] globales, ha sido sustituida en [[C++|C++]] por unas clases denominadas facetas (&amp;quot;Facets&amp;quot;) que derivan de una superclase facet.&lt;br /&gt;
Un objeto facet  puede contener prácticamente cualquier aspecto de internacionalización. Por ejemplo, el formato y símbolo de valores monetarios; los de fecha, Etc.  le proporciona un par de docenas de estas clases que proporcionan servicios similares a los proporcionados por la [[Librería Estándar C++|librería Estándar C]]. Un facet encapsula la información local que en C está englobada en una categoría CL_..., aunque de forma más especializada. Por ejemplo, la funcionalidad contenida en la categoría LC_NUMERIC está dispersa en 4 facetas:&lt;br /&gt;
  template &amp;lt;class charT&amp;gt; class numpunct;&lt;br /&gt;
  template &amp;lt;class charT&amp;gt; class numpunct_byname;&lt;br /&gt;
  template &amp;lt;class charT, class InputIterator &amp;gt; class num_get;&lt;br /&gt;
  template &amp;lt;class charT, class OutputIterator&amp;gt; class num_put;&lt;br /&gt;
De estas clases existen espacializaciones para los tipos char y wchar_t, de forma que existen las siguientes:&lt;br /&gt;
numpunct&amp;lt;char&amp;gt;&lt;br /&gt;
numpunct&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
numpunct_byname&amp;lt;char&amp;gt;&lt;br /&gt;
numpunct_byname&amp;lt;wchar_t&amp;gt;	num_get&amp;lt;char&amp;gt;&lt;br /&gt;
num_get&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
num_put&amp;lt;char&amp;gt;&lt;br /&gt;
num_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
== Clasificación ==&lt;br /&gt;
Las facetas C++ se clasifican en seis categorías básicas representadas por constantes enteras cuyos nombres son los indicados.  Aunque también pueden pertenecer a cualquier combinación de bits entre ellas. Dos de estas combinaciones tienen nombres específicos:  none (ninguna) y all (todas).&lt;br /&gt;
Los valores particulares asignados a estas constantes dependen de la implementación. A título de ejemplo mostramos un conjunto de valores posibles:&lt;br /&gt;
// Nombre Valor    Patrón de bits&lt;br /&gt;
collate  = 1;      // 00000001&lt;br /&gt;
ctype    = 2;      // 00000010&lt;br /&gt;
monetary = 4;      // 00000100&lt;br /&gt;
numeric  = 8;      // 00001000&lt;br /&gt;
time     = 16;     // 00010000&lt;br /&gt;
messages = 32;     // 00100000&lt;br /&gt;
Aparte de las dos combinaciones con nombre propio:&lt;br /&gt;
none     = 0;      // 00000000&lt;br /&gt;
all      = 63      // 00111111&lt;br /&gt;
&lt;br /&gt;
Puede existir cualquier otro tipo que sea combinación de los anteriores y que se identificaría por su valor. Por ejemplo, el valor 12 correspondería al tipo numeric-monetary, y el valor 9 al tipo collate-numeric-monetary.  Observe que el tipo all puede definirse como:&lt;br /&gt;
all = (collate | ctype | monetary | numeric | time | message );&lt;br /&gt;
== Las facetas estándar ==&lt;br /&gt;
A continuación se incluye una breve descripción de las categorías básicas. Observe que en realidad las facet estándar son clases genéricas. En la descripción que sigue, una expresión como num_get&amp;lt;charT,InputIterator&amp;gt; significa que la faceta num_get es una plantilla que acepta dos argumentos:  un tipo carácter (charT) y un iterador de entrada.  Observe que muchas de las facetas estándar están desdobladas en dos clases que aceptan respectivamente iteradores de entrada y de salida, según el tipo de operación que soportan.&lt;br /&gt;
Categoría	Facetas incluídas&lt;br /&gt;
numeric	numpunct&amp;lt;char&amp;gt;,               numpunct&amp;lt;wchar_t&amp;gt;, num_get&amp;lt;char&amp;gt;,                num_get&amp;lt;wchar_t&amp;gt; num_put&amp;lt;char&amp;gt;,                num_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
time	time_get&amp;lt;char&amp;gt;,               time_get&amp;lt;wchar_t&amp;gt;, time_put&amp;lt;char&amp;gt;,               time_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
monetary	moneypunct&amp;lt;char&amp;gt;,             moneypunct&amp;lt;wchar_t&amp;gt; moneypunct&amp;lt;char,true&amp;gt;,        moneypunct&amp;lt;wchar_t,true&amp;gt;, money_get&amp;lt;char&amp;gt;,              money_get&amp;lt;wchar_t&amp;gt; money_put&amp;lt;char&amp;gt;,              money_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
ctype	ctype&amp;lt;char&amp;gt;,                  ctype&amp;lt;wchar_t&amp;gt; codecvt&amp;lt;char,char,mbstate_t&amp;gt;, codecvt&amp;lt;wchar_t,char,mbstate_t&amp;gt;&lt;br /&gt;
collate	collate&amp;lt;char&amp;gt;,                collate&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
messages	messages&amp;lt;char&amp;gt;,               messages&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
=== Numeric ===&lt;br /&gt;
Las facetas num_get&amp;lt;charT, InputIterator&amp;gt; y num_put&amp;lt;charT, OutputIterator&amp;gt; manejan el formateo numérico. Estas clases disponen de métodos get() y put() en versiones para los tipos long, double, etc. La faceta numpunct&amp;lt;charT&amp;gt; especifica la puntuación de los formatos numéricos. Para ello dispone de métodos como decimal_point(), thousands_sep(), etc.&lt;br /&gt;
=== Time ===&lt;br /&gt;
Las clases time_get&amp;lt;charT, InputIterator&amp;gt; y time_put&amp;lt;charT, OutputIterator&amp;gt; manejan los localismos relativos a fecha y hora.  Disponen de métodos como get_time(), get_date(), get_weekday(), etc.&lt;br /&gt;
=== Monetary ===&lt;br /&gt;
Las clases money_get&amp;lt;charT, InputIterator&amp;gt; y money_put&amp;lt;charT, OutputIterator&amp;gt; manejan los localismos monetarios. Disponen de métodos get() y put() cuya finalidad es respectivamente analizar o generar una secuencia de dígitos representando una cantidad en fracción monetaria más pequeña la moneda correspondiente. Por ejemplo: la secuencia $1,056.23 en un localismo estándar USA puede traducirse en el número 105623 (centavos de Dolar USA) o en la cadena de caracteres &amp;quot;105623&amp;quot;.&lt;br /&gt;
La plantilla moneypunct&amp;lt;charT, bool&amp;gt; asume con las cantidades monetarias un papel análogo al de la clase numpunct&amp;lt;charT&amp;gt; con los formatos numéricos. Dispone de métodos como curr_symbol(), etc.&lt;br /&gt;
=== Ctype ===&lt;br /&gt;
La clase ctype&amp;lt;charT&amp;gt; encapsula las funcionalidades de clasificación de caracteres mediante métodos como tolower(), toupper(), isspace(), isprint(), etc.  La faceta codecvt&amp;lt;internT, externT, stateT&amp;gt; permite la conversión entre distintos sistemas de codificación. Por ejemplo, del sistema JIS a Unicode.  Sus métodos principales son in() y out(). Existe una especialización de esta plantilla codecvt&amp;lt;wchar_t, char, mbstate_t&amp;gt; que realiza conversiones de sistema multibyte a caracteres anchos.&lt;br /&gt;
=== Collate ===&lt;br /&gt;
La clase collate&amp;lt;charT&amp;gt; permite operaciones de ordenación y comparación de cadenas de caracteres, mediante métodos como compare(), hash() o transform().&lt;br /&gt;
=== Messages ===&lt;br /&gt;
La faceta messages&amp;lt;charT&amp;gt; implementa la especificación del consorcio X/Open para inclusión de mensajes en los programas (recordemos que la internacionalización aconseja mantener los mensajes fuera del cuerpo del ejecutable. Dispone de funciones del tipo open() y close() para mantener catálogos de mensajes.  También para recuperarlos individualmente mediante funciones como get(..., int msgid,...).&lt;br /&gt;
==  Acceder a los locales ==&lt;br /&gt;
Una interesante característica de los locales es la forma en que se acceden sus facetas. Esto no se realiza como cabría esperar mediante un método de la clase locale, sino mediante un par de funciones externas (definidas en la cabecera &amp;lt;locale&amp;gt;), que aceptan un locale como argumento. Es posible determinar si un objeto determinado contiene una faceta mediante la función has_facet(). A su vez la función use_facet() devuelve una referencia a la faceta para que pueda ser utilizada.&lt;br /&gt;
Como la mayoría de entidades de la LE, ambas funciones (en realidad son funciones genéricas), están definidas en el subespacio std.&lt;br /&gt;
=== use_facet() ===&lt;br /&gt;
Prototipo&lt;br /&gt;
template &amp;lt;class Facet&amp;gt; const Facet&amp;amp; use_facet(const locale&amp;amp; loc);&lt;br /&gt;
Este método devuelve una referencia a la faceta Facet señalada en el argumento de la plantilla. La faceta se especifica incluyéndola explícitamente en el argumento de la plantilla (ver ejemplo). Si el tipo señalado por Facet no está presente en el objeto loc, (o en su defecto, en el locale gobal), la función lanza una excepción bad_cast  en caso contrario devuelve una referencia a la faceta, que permanece válida mientras exista una copia del locale loc utilizado.&lt;br /&gt;
Ejemplo (sin incluir ningún dispositivo de control de las posibles excepciones):&lt;br /&gt;
#include &amp;lt;locale&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt; using namespace std;&lt;br /&gt;
 &lt;br /&gt;
int main () {       // ==========&lt;br /&gt;
   locale loc;&lt;br /&gt;
   const ctype&amp;lt;char&amp;gt;&amp;amp; ct = use_facet&amp;lt;ctype&amp;lt;char&amp;gt; &amp;gt;(loc); // M2:&lt;br /&gt;
   cout &amp;lt;&amp;lt; 'a' &amp;lt;&amp;lt; ct.toupper('c') &amp;lt;&amp;lt; endl;     // -&amp;gt; aC&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
En este caso se construye una referencia ct a la faceta ctype  para los tipos char y se inicia con el valor devuelto por la función use_facet.  A continuación se utiliza el método toupper() del objeto ct para transformar un carácter minúscula a mayúscula.&lt;br /&gt;
Observe el espacio entre los símbolos &amp;gt;&amp;gt; de la sentencia M2, que es necesario para que el compilador pueda distinguirlos del operador &amp;gt;&amp;gt;.  Esta invocación de la función genérica use_facet utiliza la sintaxis que hemos denominado instanciación implícita específica&lt;br /&gt;
De los tres compiladores probados:  Borland C++ 5.5;  MS Visual C++ 6.0 y GNU cpp 2.95.2, solo el de Borland compila el ejemplo sin problemas.  El manual Borland señala que si el compilador no soporta este tipo de instanciación específica (una característica relativamente nueva del lenguaje que no está totalmente implementada en muchos compiladores), es preciso utilizar una sintaxis alternativa, correspondiente a una versión sobrecargada de la anterior que si puede ser soportada por el compilador:&lt;br /&gt;
template &amp;lt;class Facet&amp;gt; const Facet&amp;amp; use_facet(const locale&amp;amp; loc, Facet* pf);&lt;br /&gt;
En este supuesto, la sentencia M2 del ejemplo quedaría como sigue:&lt;br /&gt;
const ctype&amp;lt;char&amp;gt;&amp;amp; ct = use_facet(loc,(ctype&amp;lt;char&amp;gt;*)0);&lt;br /&gt;
Obsérvese que como segundo argumento se pasa un puntero nulo (valor 0) al que se ha aplicado un modelado  para adaptarlo al tipo esperado por esta nueva versión de use_facet.&lt;br /&gt;
=== has_facet() ===&lt;br /&gt;
Prototipo:&lt;br /&gt;
template &amp;lt;class Facet&amp;gt; bool has_facet(const locale&amp;amp;) throw();&lt;br /&gt;
Esta función permite establecer si un locale tiene un tipo determinado de faceta. Devuelve cierto (true) en caso afirmativo, y falso (flase) en caso contrario. Como en el caso anterior, la instanciación debe realizarse con indicación explícita del tipo a utilizar por la plantilla.&lt;br /&gt;
Ejemplo:&lt;br /&gt;
#include &amp;lt;locale&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
using namespace std; &lt;br /&gt;
cout &amp;lt;&amp;lt; ((has_facet&amp;lt;ctype&amp;lt;char&amp;gt; &amp;gt;(L1)) ? &amp;quot;Si&amp;quot; : &amp;quot;NO&amp;quot;) &amp;lt;&amp;lt; endl; // -&amp;gt; Si&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
== Véase también  ==&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Constructor (C++)]]&lt;br /&gt;
*[[Contenedores  C++]]&lt;br /&gt;
*[[Librería Estándar C++]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|Programación C Sharp]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
*[[Code_Blocks]]&lt;br /&gt;
*[[Operadores|Operadores]] &lt;br /&gt;
*[[Tokens|Tokens]]&amp;lt;br&amp;gt; &lt;br /&gt;
*[[Identificadores|Identificadores]]&lt;br /&gt;
*[[Ámbito (Programación)|Ámbito (Programación)]]&lt;br /&gt;
*[[Enumeraciones (Informática)|Enumeraciones (Informática)]] &lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
&lt;br /&gt;
== Fuente  ==&lt;br /&gt;
* [http://http://www.zator.com/Cpp/E5_2_1.htm Facetas C++]&lt;br /&gt;
* [http://c.conclase.net/curso/index.php  Facetas en C.conclase.net]&lt;br /&gt;
* [https://docs.microsoft.com/es-es/cpp/?view=vs-2017 Clase facet]&lt;br /&gt;
[[Category:Informática]] [[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Mayle</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Facetas_C%2B%2B&amp;diff=3234398</id>
		<title>Facetas C++</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Facetas_C%2B%2B&amp;diff=3234398"/>
		<updated>2018-11-29T19:32:20Z</updated>

		<summary type="html">&lt;p&gt;Mayle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;{{Definición|Nombre= Facetas C++ |imagen=  |concepto= Las facetas [[C++|C++]] son clases muy flexibles (en realidad clases genéricas); también pueden ser definidas por el usuario o ser adquirida a terceros en forma de librería. Lo mismo que ocurría con los localismos C, las facet también se clasifican en seis categorías, y aunque en este caso los nombres no corresponden a constantes manifiestas, también corresponden a constantes enteras que rememoran muy de cerca los nombres utilizados en C : numeric; time; monetary; ctype;  collate y message}}&lt;br /&gt;
La información y su manipulación, que en el caso de C está contenida en estructuras y en [[Función (programación)|funciones]] globales, ha sido sustituida en [[C++|C++]] por unas clases denominadas facetas (&amp;quot;Facets&amp;quot;) que derivan de una superclase facet.&lt;br /&gt;
Un objeto facet  puede contener prácticamente cualquier aspecto de internacionalización. Por ejemplo, el formato y símbolo de valores monetarios; los de fecha, Etc.  le proporciona un par de docenas de estas clases que proporcionan servicios similares a los proporcionados por la [[Librería Estándar C++|librería Estándar C]]. Un facet encapsula la información local que en C está englobada en una categoría CL_..., aunque de forma más especializada. Por ejemplo, la funcionalidad contenida en la categoría LC_NUMERIC está dispersa en 4 facetas:&lt;br /&gt;
  template &amp;lt;class charT&amp;gt; class numpunct;&lt;br /&gt;
  template &amp;lt;class charT&amp;gt; class numpunct_byname;&lt;br /&gt;
  template &amp;lt;class charT, class InputIterator &amp;gt; class num_get;&lt;br /&gt;
  template &amp;lt;class charT, class OutputIterator&amp;gt; class num_put;&lt;br /&gt;
De estas clases existen espacializaciones para los tipos char y wchar_t, de forma que existen las siguientes:&lt;br /&gt;
numpunct&amp;lt;char&amp;gt;&lt;br /&gt;
numpunct&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
numpunct_byname&amp;lt;char&amp;gt;&lt;br /&gt;
numpunct_byname&amp;lt;wchar_t&amp;gt;	num_get&amp;lt;char&amp;gt;&lt;br /&gt;
num_get&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
num_put&amp;lt;char&amp;gt;&lt;br /&gt;
num_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
 == Clasificación ==&lt;br /&gt;
Las facetas C++ se clasifican en seis categorías básicas representadas por constantes enteras cuyos nombres son los indicados.  Aunque también pueden pertenecer a cualquier combinación de bits entre ellas. Dos de estas combinaciones tienen nombres específicos:  none (ninguna) y all (todas).&lt;br /&gt;
Los valores particulares asignados a estas constantes dependen de la implementación. A título de ejemplo mostramos un conjunto de valores posibles:&lt;br /&gt;
// Nombre Valor    Patrón de bits&lt;br /&gt;
collate  = 1;      // 00000001&lt;br /&gt;
ctype    = 2;      // 00000010&lt;br /&gt;
monetary = 4;      // 00000100&lt;br /&gt;
numeric  = 8;      // 00001000&lt;br /&gt;
time     = 16;     // 00010000&lt;br /&gt;
messages = 32;     // 00100000&lt;br /&gt;
Aparte de las dos combinaciones con nombre propio:&lt;br /&gt;
none     = 0;      // 00000000&lt;br /&gt;
all      = 63      // 00111111&lt;br /&gt;
&lt;br /&gt;
Puede existir cualquier otro tipo que sea combinación de los anteriores y que se identificaría por su valor. Por ejemplo, el valor 12 correspondería al tipo numeric-monetary, y el valor 9 al tipo collate-numeric-monetary.  Observe que el tipo all puede definirse como:&lt;br /&gt;
all = (collate | ctype | monetary | numeric | time | message );&lt;br /&gt;
== Las facetas estándar ==&lt;br /&gt;
A continuación se incluye una breve descripción de las categorías básicas. Observe que en realidad las facet estándar son clases genéricas. En la descripción que sigue, una expresión como num_get&amp;lt;charT,InputIterator&amp;gt; significa que la faceta num_get es una plantilla que acepta dos argumentos:  un tipo carácter (charT) y un iterador de entrada.  Observe que muchas de las facetas estándar están desdobladas en dos clases que aceptan respectivamente iteradores de entrada y de salida, según el tipo de operación que soportan.&lt;br /&gt;
Categoría	Facetas incluídas&lt;br /&gt;
numeric	numpunct&amp;lt;char&amp;gt;,               numpunct&amp;lt;wchar_t&amp;gt;, num_get&amp;lt;char&amp;gt;,                num_get&amp;lt;wchar_t&amp;gt; num_put&amp;lt;char&amp;gt;,                num_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
time	time_get&amp;lt;char&amp;gt;,               time_get&amp;lt;wchar_t&amp;gt;, time_put&amp;lt;char&amp;gt;,               time_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
monetary	moneypunct&amp;lt;char&amp;gt;,             moneypunct&amp;lt;wchar_t&amp;gt; moneypunct&amp;lt;char,true&amp;gt;,        moneypunct&amp;lt;wchar_t,true&amp;gt;, money_get&amp;lt;char&amp;gt;,              money_get&amp;lt;wchar_t&amp;gt; money_put&amp;lt;char&amp;gt;,              money_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
ctype	ctype&amp;lt;char&amp;gt;,                  ctype&amp;lt;wchar_t&amp;gt; codecvt&amp;lt;char,char,mbstate_t&amp;gt;, codecvt&amp;lt;wchar_t,char,mbstate_t&amp;gt;&lt;br /&gt;
collate	collate&amp;lt;char&amp;gt;,                collate&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
messages	messages&amp;lt;char&amp;gt;,               messages&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
=== Numeric ===&lt;br /&gt;
Las facetas num_get&amp;lt;charT, InputIterator&amp;gt; y num_put&amp;lt;charT, OutputIterator&amp;gt; manejan el formateo numérico. Estas clases disponen de métodos get() y put() en versiones para los tipos long, double, etc. La faceta numpunct&amp;lt;charT&amp;gt; especifica la puntuación de los formatos numéricos. Para ello dispone de métodos como decimal_point(), thousands_sep(), etc.&lt;br /&gt;
=== Time ===&lt;br /&gt;
Las clases time_get&amp;lt;charT, InputIterator&amp;gt; y time_put&amp;lt;charT, OutputIterator&amp;gt; manejan los localismos relativos a fecha y hora.  Disponen de métodos como get_time(), get_date(), get_weekday(), etc.&lt;br /&gt;
=== Monetary ===&lt;br /&gt;
Las clases money_get&amp;lt;charT, InputIterator&amp;gt; y money_put&amp;lt;charT, OutputIterator&amp;gt; manejan los localismos monetarios. Disponen de métodos get() y put() cuya finalidad es respectivamente analizar o generar una secuencia de dígitos representando una cantidad en fracción monetaria más pequeña la moneda correspondiente. Por ejemplo: la secuencia $1,056.23 en un localismo estándar USA puede traducirse en el número 105623 (centavos de Dolar USA) o en la cadena de caracteres &amp;quot;105623&amp;quot;.&lt;br /&gt;
La plantilla moneypunct&amp;lt;charT, bool&amp;gt; asume con las cantidades monetarias un papel análogo al de la clase numpunct&amp;lt;charT&amp;gt; con los formatos numéricos. Dispone de métodos como curr_symbol(), etc.&lt;br /&gt;
=== Ctype ===&lt;br /&gt;
La clase ctype&amp;lt;charT&amp;gt; encapsula las funcionalidades de clasificación de caracteres mediante métodos como tolower(), toupper(), isspace(), isprint(), etc.  La faceta codecvt&amp;lt;internT, externT, stateT&amp;gt; permite la conversión entre distintos sistemas de codificación. Por ejemplo, del sistema JIS a Unicode.  Sus métodos principales son in() y out(). Existe una especialización de esta plantilla codecvt&amp;lt;wchar_t, char, mbstate_t&amp;gt; que realiza conversiones de sistema multibyte a caracteres anchos.&lt;br /&gt;
=== Collate ===&lt;br /&gt;
La clase collate&amp;lt;charT&amp;gt; permite operaciones de ordenación y comparación de cadenas de caracteres, mediante métodos como compare(), hash() o transform().&lt;br /&gt;
=== Messages ===&lt;br /&gt;
La faceta messages&amp;lt;charT&amp;gt; implementa la especificación del consorcio X/Open para inclusión de mensajes en los programas (recordemos que la internacionalización aconseja mantener los mensajes fuera del cuerpo del ejecutable. Dispone de funciones del tipo open() y close() para mantener catálogos de mensajes.  También para recuperarlos individualmente mediante funciones como get(..., int msgid,...).&lt;br /&gt;
==  Acceder a los locales ==&lt;br /&gt;
Una interesante característica de los locales es la forma en que se acceden sus facetas. Esto no se realiza como cabría esperar mediante un método de la clase locale, sino mediante un par de funciones externas (definidas en la cabecera &amp;lt;locale&amp;gt;), que aceptan un locale como argumento. Es posible determinar si un objeto determinado contiene una faceta mediante la función has_facet(). A su vez la función use_facet() devuelve una referencia a la faceta para que pueda ser utilizada.&lt;br /&gt;
Como la mayoría de entidades de la LE, ambas funciones (en realidad son funciones genéricas), están definidas en el subespacio std.&lt;br /&gt;
=== use_facet() ===&lt;br /&gt;
Prototipo&lt;br /&gt;
template &amp;lt;class Facet&amp;gt; const Facet&amp;amp; use_facet(const locale&amp;amp; loc);&lt;br /&gt;
Este método devuelve una referencia a la faceta Facet señalada en el argumento de la plantilla. La faceta se especifica incluyéndola explícitamente en el argumento de la plantilla (ver ejemplo). Si el tipo señalado por Facet no está presente en el objeto loc, (o en su defecto, en el locale gobal), la función lanza una excepción bad_cast  en caso contrario devuelve una referencia a la faceta, que permanece válida mientras exista una copia del locale loc utilizado.&lt;br /&gt;
Ejemplo (sin incluir ningún dispositivo de control de las posibles excepciones):&lt;br /&gt;
#include &amp;lt;locale&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt; using namespace std;&lt;br /&gt;
 &lt;br /&gt;
int main () {       // ==========&lt;br /&gt;
   locale loc;&lt;br /&gt;
   const ctype&amp;lt;char&amp;gt;&amp;amp; ct = use_facet&amp;lt;ctype&amp;lt;char&amp;gt; &amp;gt;(loc); // M2:&lt;br /&gt;
   cout &amp;lt;&amp;lt; 'a' &amp;lt;&amp;lt; ct.toupper('c') &amp;lt;&amp;lt; endl;     // -&amp;gt; aC&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
En este caso se construye una referencia ct a la faceta ctype  para los tipos char y se inicia con el valor devuelto por la función use_facet.  A continuación se utiliza el método toupper() del objeto ct para transformar un carácter minúscula a mayúscula.&lt;br /&gt;
Observe el espacio entre los símbolos &amp;gt;&amp;gt; de la sentencia M2, que es necesario para que el compilador pueda distinguirlos del operador &amp;gt;&amp;gt;.  Esta invocación de la función genérica use_facet utiliza la sintaxis que hemos denominado instanciación implícita específica&lt;br /&gt;
De los tres compiladores probados:  Borland C++ 5.5;  MS Visual C++ 6.0 y GNU cpp 2.95.2, solo el de Borland compila el ejemplo sin problemas.  El manual Borland señala que si el compilador no soporta este tipo de instanciación específica (una característica relativamente nueva del lenguaje que no está totalmente implementada en muchos compiladores), es preciso utilizar una sintaxis alternativa, correspondiente a una versión sobrecargada de la anterior que si puede ser soportada por el compilador:&lt;br /&gt;
template &amp;lt;class Facet&amp;gt; const Facet&amp;amp; use_facet(const locale&amp;amp; loc, Facet* pf);&lt;br /&gt;
En este supuesto, la sentencia M2 del ejemplo quedaría como sigue:&lt;br /&gt;
const ctype&amp;lt;char&amp;gt;&amp;amp; ct = use_facet(loc,(ctype&amp;lt;char&amp;gt;*)0);&lt;br /&gt;
Obsérvese que como segundo argumento se pasa un puntero nulo (valor 0) al que se ha aplicado un modelado  para adaptarlo al tipo esperado por esta nueva versión de use_facet.&lt;br /&gt;
=== has_facet() ===&lt;br /&gt;
Prototipo:&lt;br /&gt;
template &amp;lt;class Facet&amp;gt; bool has_facet(const locale&amp;amp;) throw();&lt;br /&gt;
Esta función permite establecer si un locale tiene un tipo determinado de faceta. Devuelve cierto (true) en caso afirmativo, y falso (flase) en caso contrario. Como en el caso anterior, la instanciación debe realizarse con indicación explícita del tipo a utilizar por la plantilla.&lt;br /&gt;
Ejemplo:&lt;br /&gt;
#include &amp;lt;locale&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
using namespace std; &lt;br /&gt;
cout &amp;lt;&amp;lt; ((has_facet&amp;lt;ctype&amp;lt;char&amp;gt; &amp;gt;(L1)) ? &amp;quot;Si&amp;quot; : &amp;quot;NO&amp;quot;) &amp;lt;&amp;lt; endl; // -&amp;gt; Si&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
== Véase también  ==&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Constructor (C++)]]&lt;br /&gt;
*[[Contenedores  C++]]&lt;br /&gt;
*[[Librería Estándar C++]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|Programación C Sharp]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
*[[Code_Blocks]]&lt;br /&gt;
*[[Operadores|Operadores]] &lt;br /&gt;
*[[Tokens|Tokens]]&amp;lt;br&amp;gt; &lt;br /&gt;
*[[Identificadores|Identificadores]]&lt;br /&gt;
*[[Ámbito (Programación)|Ámbito (Programación)]]&lt;br /&gt;
*[[Enumeraciones (Informática)|Enumeraciones (Informática)]] &lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
&lt;br /&gt;
== Fuente  ==&lt;br /&gt;
* [http://http://www.zator.com/Cpp/E5_2_1.htm Facetas C++]&lt;br /&gt;
* [http://c.conclase.net/curso/index.php  Facetas en C.conclase.net]&lt;br /&gt;
* [https://docs.microsoft.com/es-es/cpp/?view=vs-2017 Clase facet]&lt;br /&gt;
[[Category:Informática]] [[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Mayle</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Facetas_C%2B%2B&amp;diff=3234395</id>
		<title>Facetas C++</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Facetas_C%2B%2B&amp;diff=3234395"/>
		<updated>2018-11-29T19:30:14Z</updated>

		<summary type="html">&lt;p&gt;Mayle: Página creada con «&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;{{Definición|Nombre= Facetas C++ |imagen=  |concepto= Las facetas C++ son clases muy flexibles (en realidad clases genéricas); también puede...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;{{Definición|Nombre= Facetas C++ |imagen=  |concepto= Las facetas [[C++|C++]] son clases muy flexibles (en realidad clases genéricas); también pueden ser definidas por el usuario o ser adquirida a terceros en forma de librería. Lo mismo que ocurría con los localismos C, las facet también se clasifican en seis categorías, y aunque en este caso los nombres no corresponden a constantes manifiestas, también corresponden a constantes enteras que rememoran muy de cerca los nombres utilizados en C : numeric; time; monetary; ctype;  collate y message.&lt;br /&gt;
La información y su manipulación, que en el caso de C está contenida en estructuras y en [[Función (programación)|funciones]] globales, ha sido sustituida en [[C++|C++]] por unas clases denominadas facetas (&amp;quot;Facets&amp;quot;) que derivan de una superclase facet.&lt;br /&gt;
Un objeto facet  puede contener prácticamente cualquier aspecto de internacionalización. Por ejemplo, el formato y símbolo de valores monetarios; los de fecha, Etc.  le proporciona un par de docenas de estas clases que proporcionan servicios similares a los proporcionados por la [[Librería Estándar C++|librería Estándar C]]. Un facet encapsula la información local que en C está englobada en una categoría CL_..., aunque de forma más especializada. Por ejemplo, la funcionalidad contenida en la categoría LC_NUMERIC está dispersa en 4 facetas:&lt;br /&gt;
  template &amp;lt;class charT&amp;gt; class numpunct;&lt;br /&gt;
  template &amp;lt;class charT&amp;gt; class numpunct_byname;&lt;br /&gt;
  template &amp;lt;class charT, class InputIterator &amp;gt; class num_get;&lt;br /&gt;
  template &amp;lt;class charT, class OutputIterator&amp;gt; class num_put;&lt;br /&gt;
De estas clases existen espacializaciones para los tipos char y wchar_t, de forma que existen las siguientes:&lt;br /&gt;
numpunct&amp;lt;char&amp;gt;&lt;br /&gt;
numpunct&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
numpunct_byname&amp;lt;char&amp;gt;&lt;br /&gt;
numpunct_byname&amp;lt;wchar_t&amp;gt;	num_get&amp;lt;char&amp;gt;&lt;br /&gt;
num_get&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
num_put&amp;lt;char&amp;gt;&lt;br /&gt;
num_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
 == Clasificación ==&lt;br /&gt;
Las facetas C++ se clasifican en seis categorías básicas representadas por constantes enteras cuyos nombres son los indicados.  Aunque también pueden pertenecer a cualquier combinación de bits entre ellas. Dos de estas combinaciones tienen nombres específicos:  none (ninguna) y all (todas).&lt;br /&gt;
Los valores particulares asignados a estas constantes dependen de la implementación. A título de ejemplo mostramos un conjunto de valores posibles:&lt;br /&gt;
// Nombre Valor    Patrón de bits&lt;br /&gt;
collate  = 1;      // 00000001&lt;br /&gt;
ctype    = 2;      // 00000010&lt;br /&gt;
monetary = 4;      // 00000100&lt;br /&gt;
numeric  = 8;      // 00001000&lt;br /&gt;
time     = 16;     // 00010000&lt;br /&gt;
messages = 32;     // 00100000&lt;br /&gt;
Aparte de las dos combinaciones con nombre propio:&lt;br /&gt;
none     = 0;      // 00000000&lt;br /&gt;
all      = 63      // 00111111&lt;br /&gt;
&lt;br /&gt;
Puede existir cualquier otro tipo que sea combinación de los anteriores y que se identificaría por su valor. Por ejemplo, el valor 12 correspondería al tipo numeric-monetary, y el valor 9 al tipo collate-numeric-monetary.  Observe que el tipo all puede definirse como:&lt;br /&gt;
all = (collate | ctype | monetary | numeric | time | message );&lt;br /&gt;
== Las facetas estándar ==&lt;br /&gt;
A continuación se incluye una breve descripción de las categorías básicas. Observe que en realidad las facet estándar son clases genéricas. En la descripción que sigue, una expresión como num_get&amp;lt;charT,InputIterator&amp;gt; significa que la faceta num_get es una plantilla que acepta dos argumentos:  un tipo carácter (charT) y un iterador de entrada.  Observe que muchas de las facetas estándar están desdobladas en dos clases que aceptan respectivamente iteradores de entrada y de salida, según el tipo de operación que soportan.&lt;br /&gt;
Categoría	Facetas incluídas&lt;br /&gt;
numeric	numpunct&amp;lt;char&amp;gt;,               numpunct&amp;lt;wchar_t&amp;gt;, num_get&amp;lt;char&amp;gt;,                num_get&amp;lt;wchar_t&amp;gt; num_put&amp;lt;char&amp;gt;,                num_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
time	time_get&amp;lt;char&amp;gt;,               time_get&amp;lt;wchar_t&amp;gt;, time_put&amp;lt;char&amp;gt;,               time_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
monetary	moneypunct&amp;lt;char&amp;gt;,             moneypunct&amp;lt;wchar_t&amp;gt; moneypunct&amp;lt;char,true&amp;gt;,        moneypunct&amp;lt;wchar_t,true&amp;gt;, money_get&amp;lt;char&amp;gt;,              money_get&amp;lt;wchar_t&amp;gt; money_put&amp;lt;char&amp;gt;,              money_put&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
ctype	ctype&amp;lt;char&amp;gt;,                  ctype&amp;lt;wchar_t&amp;gt; codecvt&amp;lt;char,char,mbstate_t&amp;gt;, codecvt&amp;lt;wchar_t,char,mbstate_t&amp;gt;&lt;br /&gt;
collate	collate&amp;lt;char&amp;gt;,                collate&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
messages	messages&amp;lt;char&amp;gt;,               messages&amp;lt;wchar_t&amp;gt;&lt;br /&gt;
=== Numeric ===&lt;br /&gt;
Las facetas num_get&amp;lt;charT, InputIterator&amp;gt; y num_put&amp;lt;charT, OutputIterator&amp;gt; manejan el formateo numérico. Estas clases disponen de métodos get() y put() en versiones para los tipos long, double, etc. La faceta numpunct&amp;lt;charT&amp;gt; especifica la puntuación de los formatos numéricos. Para ello dispone de métodos como decimal_point(), thousands_sep(), etc.&lt;br /&gt;
=== Time ===&lt;br /&gt;
Las clases time_get&amp;lt;charT, InputIterator&amp;gt; y time_put&amp;lt;charT, OutputIterator&amp;gt; manejan los localismos relativos a fecha y hora.  Disponen de métodos como get_time(), get_date(), get_weekday(), etc.&lt;br /&gt;
=== Monetary ===&lt;br /&gt;
Las clases money_get&amp;lt;charT, InputIterator&amp;gt; y money_put&amp;lt;charT, OutputIterator&amp;gt; manejan los localismos monetarios. Disponen de métodos get() y put() cuya finalidad es respectivamente analizar o generar una secuencia de dígitos representando una cantidad en fracción monetaria más pequeña la moneda correspondiente. Por ejemplo: la secuencia $1,056.23 en un localismo estándar USA puede traducirse en el número 105623 (centavos de Dolar USA) o en la cadena de caracteres &amp;quot;105623&amp;quot;.&lt;br /&gt;
La plantilla moneypunct&amp;lt;charT, bool&amp;gt; asume con las cantidades monetarias un papel análogo al de la clase numpunct&amp;lt;charT&amp;gt; con los formatos numéricos. Dispone de métodos como curr_symbol(), etc.&lt;br /&gt;
=== Ctype ===&lt;br /&gt;
La clase ctype&amp;lt;charT&amp;gt; encapsula las funcionalidades de clasificación de caracteres mediante métodos como tolower(), toupper(), isspace(), isprint(), etc.  La faceta codecvt&amp;lt;internT, externT, stateT&amp;gt; permite la conversión entre distintos sistemas de codificación. Por ejemplo, del sistema JIS a Unicode.  Sus métodos principales son in() y out(). Existe una especialización de esta plantilla codecvt&amp;lt;wchar_t, char, mbstate_t&amp;gt; que realiza conversiones de sistema multibyte a caracteres anchos.&lt;br /&gt;
=== Collate ===&lt;br /&gt;
La clase collate&amp;lt;charT&amp;gt; permite operaciones de ordenación y comparación de cadenas de caracteres, mediante métodos como compare(), hash() o transform().&lt;br /&gt;
=== Messages ===&lt;br /&gt;
La faceta messages&amp;lt;charT&amp;gt; implementa la especificación del consorcio X/Open para inclusión de mensajes en los programas (recordemos que la internacionalización aconseja mantener los mensajes fuera del cuerpo del ejecutable. Dispone de funciones del tipo open() y close() para mantener catálogos de mensajes.  También para recuperarlos individualmente mediante funciones como get(..., int msgid,...).&lt;br /&gt;
==  Acceder a los locales ==&lt;br /&gt;
Una interesante característica de los locales es la forma en que se acceden sus facetas. Esto no se realiza como cabría esperar mediante un método de la clase locale, sino mediante un par de funciones externas (definidas en la cabecera &amp;lt;locale&amp;gt;), que aceptan un locale como argumento. Es posible determinar si un objeto determinado contiene una faceta mediante la función has_facet(). A su vez la función use_facet() devuelve una referencia a la faceta para que pueda ser utilizada.&lt;br /&gt;
Como la mayoría de entidades de la LE, ambas funciones (en realidad son funciones genéricas), están definidas en el subespacio std.&lt;br /&gt;
=== use_facet() ===&lt;br /&gt;
Prototipo&lt;br /&gt;
template &amp;lt;class Facet&amp;gt; const Facet&amp;amp; use_facet(const locale&amp;amp; loc);&lt;br /&gt;
Este método devuelve una referencia a la faceta Facet señalada en el argumento de la plantilla. La faceta se especifica incluyéndola explícitamente en el argumento de la plantilla (ver ejemplo). Si el tipo señalado por Facet no está presente en el objeto loc, (o en su defecto, en el locale gobal), la función lanza una excepción bad_cast  en caso contrario devuelve una referencia a la faceta, que permanece válida mientras exista una copia del locale loc utilizado.&lt;br /&gt;
Ejemplo (sin incluir ningún dispositivo de control de las posibles excepciones):&lt;br /&gt;
#include &amp;lt;locale&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt; using namespace std;&lt;br /&gt;
 &lt;br /&gt;
int main () {       // ==========&lt;br /&gt;
   locale loc;&lt;br /&gt;
   const ctype&amp;lt;char&amp;gt;&amp;amp; ct = use_facet&amp;lt;ctype&amp;lt;char&amp;gt; &amp;gt;(loc); // M2:&lt;br /&gt;
   cout &amp;lt;&amp;lt; 'a' &amp;lt;&amp;lt; ct.toupper('c') &amp;lt;&amp;lt; endl;     // -&amp;gt; aC&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
En este caso se construye una referencia ct a la faceta ctype  para los tipos char y se inicia con el valor devuelto por la función use_facet.  A continuación se utiliza el método toupper() del objeto ct para transformar un carácter minúscula a mayúscula.&lt;br /&gt;
Observe el espacio entre los símbolos &amp;gt;&amp;gt; de la sentencia M2, que es necesario para que el compilador pueda distinguirlos del operador &amp;gt;&amp;gt;.  Esta invocación de la función genérica use_facet utiliza la sintaxis que hemos denominado instanciación implícita específica&lt;br /&gt;
De los tres compiladores probados:  Borland C++ 5.5;  MS Visual C++ 6.0 y GNU cpp 2.95.2, solo el de Borland compila el ejemplo sin problemas.  El manual Borland señala que si el compilador no soporta este tipo de instanciación específica (una característica relativamente nueva del lenguaje que no está totalmente implementada en muchos compiladores), es preciso utilizar una sintaxis alternativa, correspondiente a una versión sobrecargada de la anterior que si puede ser soportada por el compilador:&lt;br /&gt;
template &amp;lt;class Facet&amp;gt; const Facet&amp;amp; use_facet(const locale&amp;amp; loc, Facet* pf);&lt;br /&gt;
En este supuesto, la sentencia M2 del ejemplo quedaría como sigue:&lt;br /&gt;
const ctype&amp;lt;char&amp;gt;&amp;amp; ct = use_facet(loc,(ctype&amp;lt;char&amp;gt;*)0);&lt;br /&gt;
Obsérvese que como segundo argumento se pasa un puntero nulo (valor 0) al que se ha aplicado un modelado  para adaptarlo al tipo esperado por esta nueva versión de use_facet.&lt;br /&gt;
=== has_facet() ===&lt;br /&gt;
Prototipo:&lt;br /&gt;
template &amp;lt;class Facet&amp;gt; bool has_facet(const locale&amp;amp;) throw();&lt;br /&gt;
Esta función permite establecer si un locale tiene un tipo determinado de faceta. Devuelve cierto (true) en caso afirmativo, y falso (flase) en caso contrario. Como en el caso anterior, la instanciación debe realizarse con indicación explícita del tipo a utilizar por la plantilla.&lt;br /&gt;
Ejemplo:&lt;br /&gt;
#include &amp;lt;locale&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
using namespace std; &lt;br /&gt;
cout &amp;lt;&amp;lt; ((has_facet&amp;lt;ctype&amp;lt;char&amp;gt; &amp;gt;(L1)) ? &amp;quot;Si&amp;quot; : &amp;quot;NO&amp;quot;) &amp;lt;&amp;lt; endl; // -&amp;gt; Si&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
== Véase también  ==&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Constructor (C++)]]&lt;br /&gt;
*[[Contenedores  C++]]&lt;br /&gt;
*[[Librería Estándar C++]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|Programación C Sharp]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
*[[Code_Blocks]]&lt;br /&gt;
*[[Operadores|Operadores]] &lt;br /&gt;
*[[Tokens|Tokens]]&amp;lt;br&amp;gt; &lt;br /&gt;
*[[Identificadores|Identificadores]]&lt;br /&gt;
*[[Ámbito (Programación)|Ámbito (Programación)]]&lt;br /&gt;
*[[Enumeraciones (Informática)|Enumeraciones (Informática)]] &lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
&lt;br /&gt;
== Fuente  ==&lt;br /&gt;
* [http://http://www.zator.com/Cpp/E5_2_1.htm Facetas C++]&lt;br /&gt;
* [http://c.conclase.net/curso/index.php  Facetas en C.conclase.net]&lt;br /&gt;
* [https://docs.microsoft.com/es-es/cpp/?view=vs-2017 Clase facet]&lt;br /&gt;
[[Category:Informática]] [[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Mayle</name></author>
		
	</entry>
</feed>