{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/sintaxis-basica-cpp-parte-2","result":{"data":{"markdownRemark":{"id":"9ae70b30-cc45-51fe-9e3d-90c84a23d6e7","html":"<p>En esta segunda parte de esta serie veremos uno de los principales elementos que distinguen a C++ de su antecesor: las clases. Además, haremos un pequeño paseo por algunos contenedores básicos que ofrece la STL.</p>\n<h2 id=\"clases\" style=\"position:relative;\"><a href=\"#clases\" aria-label=\"clases permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Clases</h2>\n<p>Las clases son la piedra angular de la programación orientada a objetos. Básicamente son armazones con los cuales uno crea objetos que pueden contener datos y que, además, pueden operar con esos datos. Una clase, por lo general, va a estar compuesta de dos archivos: un archivo de cabecera (generalmente usando la extensión <code class=\"language-text\">.h</code> o <code class=\"language-text\">.hpp</code>), que define su estructura, y un archivo fuente (<code class=\"language-text\">.cpp</code>, <code class=\"language-text\">.cxx</code>, <code class=\"language-text\">.cc</code>, entre otras; queda a gusto del programador cuál usar), que implementa el código definido por la estructura.</p>\n<p>El archivo de cabecera de una clase puede verse de la siguiente forma:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token comment\">// persona.h</span>\n\n<span class=\"token comment\">// Estas líneas (llamadas directrices de preprocesador,</span>\n<span class=\"token comment\">// que, en este caso, forman un \"include guard\") le</span>\n<span class=\"token comment\">// indican al compilador que lea este archivo sólo</span>\n<span class=\"token comment\">// una vez, en caso de que sea utilizado en más de un sitio.</span>\n<span class=\"token comment\">// Todo archivo .h debiera utilizarlas</span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">ifndef</span> <span class=\"token expression\">PERSONA_H</span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">define</span> <span class=\"token macro-name\">PERSONA_H</span></span>\n\n<span class=\"token comment\">// Una alternativa no estándar pero soportada por la</span>\n<span class=\"token comment\">// mayoría de los compiladores es #pragma once. Si usaran</span>\n<span class=\"token comment\">// esta forma, omitan el include guard (las líneas que parten</span>\n<span class=\"token comment\">// con #ifndef y #define y la línea #endif al final del</span>\n<span class=\"token comment\">// documento). Solo deberían usar una de estas a la vez.</span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">pragma</span> <span class=\"token expression\">once</span></span>\n\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;string></span></span>\n\n<span class=\"token comment\">// Una clase puede tener miembros:</span>\n<span class=\"token comment\">//   - públicos (accesibles por cualquiera)</span>\n<span class=\"token comment\">//   - privados (accesibles sólo por la clase misma)</span>\n<span class=\"token comment\">//   - protegidos (accesibles sólo por la clase</span>\n<span class=\"token comment\">//     misma y sus subclases)</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Persona</span> <span class=\"token punctuation\">{</span>\n<span class=\"token comment\">// Estos no podrán ser accedidos desde fuera de la clase.</span>\n<span class=\"token comment\">// Si tuviéramos una instancia de Persona llamada p,</span>\n<span class=\"token comment\">// escribir p.nombre va a generar un error de compilación</span>\n<span class=\"token keyword\">private</span><span class=\"token operator\">:</span>\n    <span class=\"token comment\">// Tanto nombre como edad se denominan atributos</span>\n    <span class=\"token comment\">// (o campos). Funcionan como variables, las cuales</span>\n    <span class=\"token comment\">// serán únicas para cada instancia de Persona (es</span>\n    <span class=\"token comment\">// decir, cada persona tendrá su propio nombre y edad)</span>\n    std<span class=\"token double-colon punctuation\">::</span>string nombre<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">unsigned</span> edad<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// En cambio, estos pueden utilizarse desde fuera y funcionan</span>\n<span class=\"token comment\">// como la cara visible de la clase</span>\n<span class=\"token keyword\">public</span><span class=\"token operator\">:</span>\n    <span class=\"token comment\">// Este es el constructor (puede haber más de uno), donde</span>\n    <span class=\"token comment\">// se inicializa cada instancia de la clase, se definen</span>\n    <span class=\"token comment\">// sus valores iniciales, entre otras cosas. Un</span>\n    <span class=\"token comment\">// constructor no especifica un tipo de retorno.</span>\n    <span class=\"token function\">Persona</span><span class=\"token punctuation\">(</span>std<span class=\"token double-colon punctuation\">::</span>string nombre<span class=\"token punctuation\">,</span> <span class=\"token keyword\">unsigned</span> edad<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Estas funciones se denominan métodos. Los métodos</span>\n    <span class=\"token comment\">// pueden acceder a los atributos de cada instancia y</span>\n    <span class=\"token comment\">// trabajar con estos.</span>\n    std<span class=\"token double-colon punctuation\">::</span>string <span class=\"token function\">get_nombre</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">unsigned</span> <span class=\"token function\">get_edad</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">endif</span> <span class=\"token comment\">// PERSONA_H      Omitir si usan #pragma once</span></span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token comment\">// clase.cpp</span>\n\n<span class=\"token comment\">// En este archivo vamos a implementar tanto el</span>\n<span class=\"token comment\">// constructor como los dos métodos que están definidos</span>\n<span class=\"token comment\">// en el archivo de cabecera.</span>\n\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">\"persona.h\"</span></span>\n\n<span class=\"token comment\">// Para implementar los métodos de una clase,</span>\n<span class=\"token comment\">// anteponemos al nombre de cada uno el de la clase,</span>\n<span class=\"token comment\">// seguido de ::</span>\n<span class=\"token class-name\">Persona</span><span class=\"token double-colon punctuation\">::</span><span class=\"token function\">Persona</span><span class=\"token punctuation\">(</span>std<span class=\"token double-colon punctuation\">::</span>string nombre<span class=\"token punctuation\">,</span> <span class=\"token keyword\">unsigned</span> edad<span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">:</span> <span class=\"token function\">nombre</span><span class=\"token punctuation\">(</span>nombre<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">edad</span><span class=\"token punctuation\">(</span>edad<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Esta de arriba es una notación especial que nos</span>\n    <span class=\"token comment\">// permite asignar directamente el valor de cada</span>\n    <span class=\"token comment\">// argumento con un atributo de la clase (en este</span>\n    <span class=\"token comment\">// caso, el atributo nombre recibe el valor del</span>\n    <span class=\"token comment\">// parámetro del mismo nombre; lo mismo con edad)</span>\n\n    <span class=\"token comment\">// Podemos hacer esto en lugar de la forma</span>\n    <span class=\"token comment\">// anterior si gustan</span>\n    <span class=\"token comment\">// this->nombre = nombre;</span>\n    <span class=\"token comment\">// this->edad = edad;</span>\n\n    <span class=\"token comment\">// El puntero this nos permite acceder a todos los</span>\n    <span class=\"token comment\">// atributos de la instancia actual de la clase.</span>\n    <span class=\"token comment\">// La usamos en este caso para evitar ambigüedades</span>\n    <span class=\"token comment\">// (ya que atributo y parámetro se llaman igual)</span>\n<span class=\"token punctuation\">}</span>\n\nstd<span class=\"token double-colon punctuation\">::</span>string <span class=\"token class-name\">Persona</span><span class=\"token double-colon punctuation\">::</span><span class=\"token function\">get_nombre</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Como en este caso no hay otro elemento llamado</span>\n    <span class=\"token comment\">// nombre en la función, podemos prescindir del</span>\n    <span class=\"token comment\">// this-> con seguridad</span>\n    <span class=\"token keyword\">return</span> nombre<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">unsigned</span> <span class=\"token class-name\">Persona</span><span class=\"token double-colon punctuation\">::</span><span class=\"token function\">get_edad</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> edad<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Luego, para utilizar la clase en nuestro código, podemos hacer lo siguiendo, sin olvidar incluir el archivo .cpp entre los que el compilador va a recibir:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token comment\">// main.cpp</span>\n\n<span class=\"token comment\">// Los archivos de cabecera que son parte del proyecto</span>\n<span class=\"token comment\">// debieran ser incluidos usando comillas dobles (\"\"),</span>\n<span class=\"token comment\">// mientras que las librerías de sistema con &lt;></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;iostream></span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">\"persona.h\"</span></span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Así creamos una instancia cuyo atributo</span>\n    <span class=\"token comment\">// nombre contendrá el string \"Juan López\"</span>\n    <span class=\"token comment\">// y edad el número 40. Noten que los argumentos</span>\n    <span class=\"token comment\">// dados coinciden con los parámetros definidos</span>\n    <span class=\"token comment\">// en persona.cpp y persona.h</span>\n    Persona <span class=\"token function\">p</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Juan López\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">40</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> p<span class=\"token punctuation\">.</span><span class=\"token function\">get_nombre</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\" tiene \"</span>\n              <span class=\"token operator\">&lt;&lt;</span> p<span class=\"token punctuation\">.</span><span class=\"token function\">get_edad</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\" años.\\n\"</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Retornamos 0 para indicar que el programa</span>\n    <span class=\"token comment\">// se ejecutó exitosamente</span>\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Podríamos compilar el programa con esta llamada a <code class=\"language-text\">g++</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">g++ -o prueba_persona main.cpp persona.cpp</code></pre></div>\n<p>Si desean mantener los archivos de cabecera y fuente separados, pueden hacer uso\nde esta estructura de archivos:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">prueba_persona/\n |-- src/                 Archivos fuente\n |    |- main.cpp\n |    \\- persona.cpp\n \\-- include/             Archivos de cabecera\n      \\- persona.h</code></pre></div>\n<p>Para compilar, pueden usar este comando (asegurándose de estar en la carpeta <code class=\"language-text\">prueba_persona</code>):</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">g++ -o prueba_persona src/main.cpp src/persona.cpp -I include/</code></pre></div>\n<p>El argumento <code class=\"language-text\">-I &lt;carpeta></code> le indica al compilador dónde tiene que buscar los archivos <code class=\"language-text\">.h</code> que hemos creado, ya que no están en la misma carpeta que los <code class=\"language-text\">.cpp</code>.</p>\n<h3 id=\"constructores-y-destructores\" style=\"position:relative;\"><a href=\"#constructores-y-destructores\" aria-label=\"constructores y destructores permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Constructores y destructores</h3>\n<p>Antes de continuar, me quiero detener un momento para explicar un poco más sobre los contenedores y destructores, también llamados <em>ctor(s)</em> y <em>dtor(s)</em> (a partir de los términos <em>constructor(s)</em> y <em>destructor(s)</em> en inglés). Estos dos son métodos especiales dentro de una clase y son llamados al momento de crear una instancia de esta o cuando el objeto se sale de <em>scope</em> o se invoca a <code class=\"language-text\">delete</code>, respectivamente (veremos estos últimos dos casos en detalle después).</p>\n<h4 id=\"constructores\" style=\"position:relative;\"><a href=\"#constructores\" aria-label=\"constructores permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Constructores</h4>\n<p>Como mencionaba, los constructores se ejecutan al momento de crear una instancia de clase. Por lo general se encargan de inicializar los atributos de la nueva instancia y, por tanto, puede recibir argumentos de parte del programador. También es posible definir más de un constructor en caso de ser necesario.</p>\n<p>Cabe también agregar que si no definimos un constructor en nuestra clase, el compilador nos proveerá uno trivial. Además, los atributos que puedan construirse por defecto (como los contenedores y tipos de la STL) lo harán automáticamente, añadamos o no un constructor.</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Clase</span> <span class=\"token punctuation\">{</span>\n<span class=\"token keyword\">private</span><span class=\"token operator\">:</span>\n    std<span class=\"token double-colon punctuation\">::</span>string nombre<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">unsigned</span> edad<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">public</span><span class=\"token operator\">:</span>\n    <span class=\"token function\">Clase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">Clase</span><span class=\"token punctuation\">(</span>std<span class=\"token double-colon punctuation\">::</span>string nombre<span class=\"token punctuation\">,</span> <span class=\"token keyword\">unsigned</span> edad<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token class-name\">Clase</span><span class=\"token double-colon punctuation\">::</span><span class=\"token function\">Clase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token function\">nombre</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">edad</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token class-name\">Clase</span><span class=\"token double-colon punctuation\">::</span><span class=\"token function\">Clase</span><span class=\"token punctuation\">(</span>std<span class=\"token double-colon punctuation\">::</span>string nombre<span class=\"token punctuation\">,</span> <span class=\"token keyword\">unsigned</span> edad<span class=\"token punctuation\">)</span>\n  <span class=\"token operator\">:</span> <span class=\"token function\">nombre</span><span class=\"token punctuation\">(</span>nombre<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">edad</span><span class=\"token punctuation\">(</span>edad<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>En este ejemplo, podemos ver que <code class=\"language-text\">Clase(std::string, unsigned)</code> asignará el nombre y edad que le entregamos a los atributos del mismo nombre, lo que es usual. Con respecto a <code class=\"language-text\">Clase()</code>, lo que ocurrirrá es que tanto <code class=\"language-text\">nombre</code> como <code class=\"language-text\">edad</code> se definan como <code class=\"language-text\">\"\"</code> y <code class=\"language-text\">0</code>, respectivamente. Ambas definiciones son válidas y no producen conflictos entre sí, ya que los parámetros que esperan son diferentes (ninguno contra un <code class=\"language-text\">std::string</code> y un <code class=\"language-text\">unsigned</code>).</p>\n<p>Si, por ejemplo, <code class=\"language-text\">Clase</code> también contuviera un puntero bruto a memoria, podríamos inicializarlo haciendo uso de <code class=\"language-text\">malloc</code> o <code class=\"language-text\">free</code> dentro del constructor, sin olvidarse de liberar los recursos solicitados en el destructor, que es lo que veremos a continuación.</p>\n<h4 id=\"destructores\" style=\"position:relative;\"><a href=\"#destructores\" aria-label=\"destructores permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Destructores</h4>\n<p>Cuando nuestra instancia se sale de <em>scope</em> o ejecutamos <code class=\"language-text\">delete</code>, el programa llamará al destructor de nuestra clase, el cual se encargará de liberar graciosamente cualquier asignación de memoria que hayamos hecho, además de “saldar cuentas” en nuestra función si es necesario:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">ClaseConDtor</span> <span class=\"token punctuation\">{</span>\n<span class=\"token keyword\">private</span><span class=\"token operator\">:</span>\n    std<span class=\"token double-colon punctuation\">::</span>string str<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">public</span><span class=\"token operator\">:</span>\n    <span class=\"token function\">ClaseConDtor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token operator\">~</span><span class=\"token function\">ClaseConDtor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Este es nuestro destructor.</span>\n                     <span class=\"token comment\">// Un destructor nunca recibe</span>\n                     <span class=\"token comment\">// argumentos</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    ClaseConDtor <span class=\"token function\">a</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Creamos una instancia</span>\n\n    <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">// Al momento de abandonar el if, el destructor</span>\n<span class=\"token comment\">// es llamado automáticamente. El atributo str</span>\n<span class=\"token comment\">// también invoca al suyo y libera la memoria</span>\n<span class=\"token comment\">// que utilizaba el string</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">ClaseConDtorMem</span> <span class=\"token punctuation\">{</span>\n<span class=\"token keyword\">private</span><span class=\"token operator\">:</span>\n    <span class=\"token comment\">// ...</span>\n<span class=\"token keyword\">public</span><span class=\"token operator\">:</span>\n    <span class=\"token function\">ClaseConDtorMem</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token operator\">~</span><span class=\"token function\">ClaseConDtorMem</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Creamos una instancia en el heap</span>\n<span class=\"token comment\">// (traten de usar punteros lo menos posible, insisto)</span>\nClaseConDtorMem <span class=\"token operator\">*</span>c <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token function\">ClaseConDtorMem</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ...</span>\n\n<span class=\"token keyword\">delete</span> c<span class=\"token punctuation\">;</span> <span class=\"token comment\">// Aquí invocamos al destructor de nuestra</span>\n          <span class=\"token comment\">// clase. Una vez hecho, la memoria que</span>\n          <span class=\"token comment\">// solicitó es devuelta al SO</span></code></pre></div>\n<p>Si su clase no utiliza punteros en bruto, por lo general no va a ser necesario definir un destructor, pues el que entrega el compilador por defecto va a servir en la mayoría de los casos. Como veíamos anteriormente, cualquier instancia de clase que ya tenga definido su propio destructor (como el <em>string</em> de <code class=\"language-text\">ClaseConDtor</code>) lo va a llamar al momento de invocar el nuestro, lo que nos permite despreocuparnos de ver si el destructor de los atributos fue llamado, pues se hará automáticamente.</p>\n<h2 id=\"contenedores\" style=\"position:relative;\"><a href=\"#contenedores\" aria-label=\"contenedores permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Contenedores</h2>\n<p>Ya que casi todo programa necesita almacenar datos de una forma u otra, se vuelve necesario trabajar con estructuras que los almacenen y nos permitan operar con ellos. Para aplicaciones simples podemos recurrir al clásico arreglo (ya sea de tamaño fijo o variable), pero si nuestros datos ganan complejidad o necesitamos ciertas garantías de tiempo (como adición o lectura en tiempo constante), vamos a tener que utilizar otro tipo de enfoque. El tema es que muchas de las veces estamos reinventando la rueda y no necesitamos realmente crear nuestras propias clases cuando podemos utilizar código hecho por expertos en el tema (a menos que nos estén enseñando cómo funcionan estas estructuras, claro está). Es por esto que les mostraré algunas de estas estructuras que vienen “de fábrica” en cualquier implementación de la librería estándar de C++.</p>\n<h3 id=\"arreglos-dinámicos-stdvector\" style=\"position:relative;\"><a href=\"#arreglos-din%C3%A1micos-stdvector\" aria-label=\"arreglos dinámicos stdvector permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Arreglos dinámicos (<code class=\"language-text\">std::vector</code>)</h3>\n<p>Esta es uno de los contenedores más simples de usar y el que más se van a encontrar. <code class=\"language-text\">std::vector</code> implementa un arreglo de tamaño variable que se encarga de forma automática de agrandar la estructura subyacente que almacena la información:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token comment\">// Este arreglo es de tamaño fijo. Podemos</span>\n<span class=\"token comment\">// alterar los números que ya contiene, pero</span>\n<span class=\"token comment\">// no podemos agregarle ni quitarle celdas.</span>\n<span class=\"token keyword\">int</span> nums<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\nnums<span class=\"token punctuation\">[</span><span class=\"token number\">8</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">13</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// A menos que quieran que su programa</span>\n              <span class=\"token comment\">// falle o no compile, no hagan esto.</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;iostream></span></span>\n\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;vector></span> <span class=\"token comment\">// Tenemos que incluir esta librería</span></span>\n                  <span class=\"token comment\">// para usar vectores</span>\n\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">\"persona.h\"</span></span>\n\n<span class=\"token comment\">// Como nums2 es un vector, podemos alterar los números</span>\n<span class=\"token comment\">// que contiene, agregar y eliminar a libertad.</span>\nstd<span class=\"token double-colon punctuation\">::</span>vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span> nums2<span class=\"token punctuation\">{</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\nnums2<span class=\"token punctuation\">.</span><span class=\"token function\">push_back</span><span class=\"token punctuation\">(</span><span class=\"token number\">13</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Así agregamos un número al final</span>\n<span class=\"token keyword\">int</span> trece <span class=\"token operator\">=</span> nums2<span class=\"token punctuation\">.</span><span class=\"token function\">pop_back</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Y así lo eliminamos</span>\n\n<span class=\"token comment\">// Así podemos obtener el tamaño del vector</span>\nstd<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> nums2<span class=\"token punctuation\">.</span><span class=\"token function\">size</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> std<span class=\"token double-colon punctuation\">::</span>endl<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Así inicializamos un vector vacío</span>\nstd<span class=\"token double-colon punctuation\">::</span>vector<span class=\"token operator\">&lt;</span>Persona<span class=\"token operator\">></span> gente<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Y así podemos construir \"in situ\" una instancia,</span>\n<span class=\"token comment\">// si es que el tipo es construible. Tan solo tenemos</span>\n<span class=\"token comment\">// que pasar los mismos parámetros que de costumbre.</span>\ngente<span class=\"token punctuation\">.</span><span class=\"token function\">emplace_back</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Alan Turing\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">41</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Eso es equivalente a esto:</span>\nPersona <span class=\"token function\">alan</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Alan Turing\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">41</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\ngente<span class=\"token punctuation\">.</span><span class=\"token function\">push_back</span><span class=\"token punctuation\">(</span>alan<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Si queremos limpiar el vector, llamamos a clear()</span>\ngente<span class=\"token punctuation\">.</span><span class=\"token function\">clear</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Para comprobar que lo limpiamos, podemos usar</span>\n<span class=\"token comment\">// el método empty() o chequear que size() == 0</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>gente<span class=\"token punctuation\">.</span><span class=\"token function\">empty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Vacío\"</span> <span class=\"token operator\">&lt;&lt;</span> std<span class=\"token double-colon punctuation\">::</span>endl<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// if (gente.size() == 0) {</span>\n<span class=\"token comment\">//    std::cout &lt;&lt; \"Vacío\" &lt;&lt; std::endl;</span>\n<span class=\"token comment\">// }</span></code></pre></div>\n<h3 id=\"listas-enlazadas-stdlist\" style=\"position:relative;\"><a href=\"#listas-enlazadas-stdlist\" aria-label=\"listas enlazadas stdlist permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Listas enlazadas (<code class=\"language-text\">std::list</code>)</h3>\n<p>A diferencia de los vectores, que almacenan su información en un trozo contiguo de memoria que se va moviendo a medida que aumenta el número de elementos que debe almacenar, las listas enlazadas pueden perfectamente estar desperdigadas en la RAM y siguen siendo totalmente accesibles y modificables.</p>\n<p>Una lista enlazada se compone de nodos, que contienen la información que queremos guardar, y punteros que apuntan al siguiente elemento en la cadena (lista simplemente enlazada) o, incluso, al elemento anterior y siguiente (lista doblemente enlazada):</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 771px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAApElEQVQY05WOyxJEMBBF/f+3WduxIIgqJMQjocgcMaqmZucsUrc7fW935Jyz1hZFUdd1VVVlWc7zrLVGCCGklLzbtskAmjHEvu/neUZN09Aax7ELTNOUJEmWZcYYyrZt+YrjGEFi95DnOWVEAKvwK6V0ABsG9TAMA4k074G+79HHcVybvfdcxTHc719ymck2ATR5v+/NPfpXfs3LsqRpuq7r280fFzVYs7tpHe0AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/d38a72319f20c4edb8362a83da2d3126/8ac56/doubly-linked-list.webp 240w,\n/static/d38a72319f20c4edb8362a83da2d3126/d3be9/doubly-linked-list.webp 480w,\n/static/d38a72319f20c4edb8362a83da2d3126/d5234/doubly-linked-list.webp 771w\"\n              sizes=\"(max-width: 771px) 100vw, 771px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/d38a72319f20c4edb8362a83da2d3126/8ff5a/doubly-linked-list.png 240w,\n/static/d38a72319f20c4edb8362a83da2d3126/e85cb/doubly-linked-list.png 480w,\n/static/d38a72319f20c4edb8362a83da2d3126/5d030/doubly-linked-list.png 771w\"\n            sizes=\"(max-width: 771px) 100vw, 771px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/d38a72319f20c4edb8362a83da2d3126/5d030/doubly-linked-list.png\"\n            alt=\"Una lista doblemente enlazada\"\n            title=\"Una lista doblemente enlazada\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n    </span></p>\n<p align=\"center\"><i>Cortesía de <a href=\"https://www.studytonight.com/code/python/ds/doubly-linked-list-introduction-insertion.php\">Studytonight</a></i></p>\n<p>La ventaja de las listas doblemente enlazadas es que permiten la inserción y eliminación de elementos en tiempo constante tanto al inicio y final de ella.</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;list></span></span>\n\n<span class=\"token comment\">// Una lista doblemente enlazada</span>\nstd<span class=\"token double-colon punctuation\">::</span>list<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span> lista<span class=\"token punctuation\">{</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\nlista<span class=\"token punctuation\">.</span><span class=\"token function\">push_back</span><span class=\"token punctuation\">(</span><span class=\"token number\">6</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Ahora la lista queda</span>\n<span class=\"token comment\">// 1 &lt;-> 2 &lt;-> 3 &lt;-> 4 &lt;-> 5 &lt;-> 6</span>\n\nlista<span class=\"token punctuation\">.</span><span class=\"token function\">push_front</span><span class=\"token punctuation\">(</span><span class=\"token number\">7</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Ahora la lista queda</span>\n<span class=\"token comment\">// 7 &lt;-> 1 &lt;-> 2 &lt;-> 3 &lt;-> 4 &lt;-> 5 &lt;-> 6</span>\n\nlista<span class=\"token punctuation\">.</span><span class=\"token function\">pop_back</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nlista<span class=\"token punctuation\">.</span><span class=\"token function\">pop_back</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nlista<span class=\"token punctuation\">.</span><span class=\"token function\">pop_front</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Finalmente:</span>\n<span class=\"token comment\">// 1 &lt;-> 2 &lt;-> 3 &lt;-> 4</span></code></pre></div>\n<p>Como es posible recorrer una lista doblemente enlazada de atrás hacia adelante, podemos iterar un <code class=\"language-text\">std::list</code> en reversa, algo que veremos con detalle en otra ocasión:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\">std<span class=\"token double-colon punctuation\">::</span>list<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span> fibonacci<span class=\"token punctuation\">{</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">,</span> <span class=\"token number\">13</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Iteración regular (de inicio a fin)</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> n <span class=\"token operator\">:</span> fibonacci<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> n <span class=\"token operator\">&lt;&lt;</span> std<span class=\"token double-colon punctuation\">::</span>endl<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Iteración en reversa</span>\n<span class=\"token keyword\">auto</span> it <span class=\"token operator\">=</span> fibonacci<span class=\"token punctuation\">.</span><span class=\"token function\">rbegin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">auto</span> end <span class=\"token operator\">=</span> fibonacci<span class=\"token punctuation\">.</span><span class=\"token function\">rend</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">;</span> it <span class=\"token operator\">!=</span> end<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>it<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> n <span class=\"token operator\">&lt;&lt;</span> std<span class=\"token double-colon punctuation\">::</span>endl<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// El tipo auto nos permite omitir el tipo de una variable</span>\n<span class=\"token comment\">// si es muy largo y deja su determinación a cargo del</span>\n<span class=\"token comment\">// compilador</span>\n\n<span class=\"token comment\">// La anterior sintaxis no es la más cómoda (de hecho,</span>\n<span class=\"token comment\">// es una de las razones por las que puse el iterador</span>\n<span class=\"token comment\">// inicial y de fin en líneas aparte para mejorarlo</span>\n<span class=\"token comment\">// un poco), pero desde C++20 en adelante existe una</span>\n<span class=\"token comment\">// forma mucho más simple que podemos usar, gracias</span>\n<span class=\"token comment\">// a la nueva librería ranges</span>\n\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;ranges></span></span>\n\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> n <span class=\"token operator\">:</span> fibonacci <span class=\"token operator\">|</span> std<span class=\"token double-colon punctuation\">::</span>views<span class=\"token double-colon punctuation\">::</span>reverse<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> n <span class=\"token operator\">&lt;&lt;</span> std<span class=\"token double-colon punctuation\">::</span>endl<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// El operador tubería (|) le entrega la lista a</span>\n<span class=\"token comment\">// std::views::reverse, el cual invierte los iteradores</span>\n<span class=\"token comment\">// y permite recorrerlo en reversa con menos código</span></code></pre></div>\n<h4 id=\"listas-simplemente-enlazadas\" style=\"position:relative;\"><a href=\"#listas-simplemente-enlazadas\" aria-label=\"listas simplemente enlazadas permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Listas simplemente enlazadas</h4>\n<p>Si queremos trabajar con listas simplemente enlazadas (tanto porque no nos interesa la iteración en reversa o porque queremos ahorrar espacio) basta con usar la variante <code class=\"language-text\">std::forward_list</code>, que funciona de forma idéntica a <code class=\"language-text\">std::list</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;forward_list></span></span>\n\nstd<span class=\"token double-colon punctuation\">::</span>forward_list<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span> simple<span class=\"token punctuation\">{</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Iteración regular (de inicio a fin)</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> n <span class=\"token operator\">:</span> simple<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> n <span class=\"token operator\">&lt;&lt;</span> std<span class=\"token double-colon punctuation\">::</span>endl<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// ESTO NO VA A FUNCIONAR</span>\n<span class=\"token keyword\">auto</span> it <span class=\"token operator\">=</span> simple<span class=\"token punctuation\">.</span><span class=\"token function\">rbegin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">auto</span> end <span class=\"token operator\">=</span> simple<span class=\"token punctuation\">.</span><span class=\"token function\">rend</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">;</span> it <span class=\"token operator\">!=</span> end<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>it<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    std<span class=\"token double-colon punctuation\">::</span>cout <span class=\"token operator\">&lt;&lt;</span> n <span class=\"token operator\">&lt;&lt;</span> std<span class=\"token double-colon punctuation\">::</span>endl<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"conclusión\" style=\"position:relative;\"><a href=\"#conclusi%C3%B3n\" aria-label=\"conclusión permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conclusión</h3>\n<p>Esperando que les haya servido este artículo, en la próxima iteración veremos las dos principales formas de almacenar variables en memoria (<em>heap</em> y <em>stack</em>), además de cómo las funciones debieran recibir parámetros si queremos lograr un manejo eficiente de la memoria. ¡Nos vemos en la próxima!</p>","fields":{"slug":"/posts/sintaxis-basica-cpp-parte-2","tagSlugs":["/tag/programming/","/tag/c/","/tag/espanol/"]},"frontmatter":{"date":"2021-03-18T00:34:00Z","description":"Clases, constructores, destructores y contenendores de la STL.","tags":["Programming","C++","Español"],"title":"[ES] Sintáxis básica de C++ (parte 2)","socialImage":{"publicURL":"/static/f463ff7592afdee2e8660e64fb228e0c/photo.jpg"}}}},"pageContext":{"slug":"/posts/sintaxis-basica-cpp-parte-2"}},"staticQueryHashes":["251939775","3991641674","401334301"]}