<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Jorge Jara]]></title><description><![CDATA[Student, cat lover, SI fanboy. (he/they)]]></description><link>https://jorgejarai.github.io</link><generator>GatsbyJS</generator><lastBuildDate>Mon, 19 Dec 2022 00:30:12 GMT</lastBuildDate><item><title><![CDATA[[ES] Mi propia calculadora IPC]]></title><description><![CDATA[Considerando que la calculadora que ofrece el INE para la variación del IPC no es tan buena, decidí hacer una yo mismo.]]></description><link>https://jorgejarai.github.io/posts/mi-propia-calculadora-ipc</link><guid isPermaLink="false">https://jorgejarai.github.io/posts/mi-propia-calculadora-ipc</guid><pubDate>Thu, 22 Jul 2021 02:05:00 GMT</pubDate><content:encoded>&lt;p&gt;Estaba en medio de una de mis típicas crisis de aburrimiento tratando de buscar una idea para una &lt;em&gt;app&lt;/em&gt; en React (buscar ideas factibles nunca ha sido mi fuerte) cuando, de repente, me acordé de la &lt;a href=&quot;https://calculadoraipc.ine.cl/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;calculadora de variación del IPC&lt;/a&gt; que ofrece el INE (Instituto Nacional de Estadísticas, el ente chileno a cargo de cosas como el censo y estadísticas vitales) para determinar el poder adquisitivo del peso chileno (CLP) a lo largo del tiempo. La página cumple su propósito, sin lugar a dudas, pero me pregunté si podría hacer una propia que cumpla el mismo propósito, usando tecnologías más recientes y que se vea ligeramente mejor. Como me pareció una excelente idea para una &lt;em&gt;app&lt;/em&gt; de la que me sentiría lo suficientemente orgulloso como para no tener oculta en una carpeta de mi PC, me dispuse a crear un proyecto Next.js y me puse manos a la obra.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 960px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d942956f6fd996ccd94ac94ad0315f0c/d69c4/calculadora-ipc-ine.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.08333333333333%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABsUlEQVQoz51TS24UMRCdS7FhwfBbwOlAhIhwghyCBeEzKEEcAE3ICGURDeP+uP1tt9t+VLnToXcgLD1VdVX5qapfeaWbDtW+gu97GGNgrYVzrvierPceOWf861lxcUoJ4zj+J/7cTSljNQwD6lZB1B0aqUtH3K33/WSXvp/h4RYo3zQNc60iMRut0dQVuraB6SSUbAgt9MJnqzuKkW+1grcazkxIMSCNcSLkuU+/XeP+y894fnKO9dEXPCCwXb8m/9UGD48mrAmPKPb4+BxP3lzgKeHZ26+492KD4487YqKRiRo/hcKnHwKbqwpnlwIfCGzfbw93mONz7myOE959/4XtXiKnSCNHatU7JG9Azq1WeUIegEix2P9d3jwi8Misjuw0bvY1tHaoSZhDJaGNQyQFE23BSOqxDTFB6IDr1sGGcZGjXobbf8iEShscBP1s69Api7ao3Zd1Wp4wZlwKiy3BEOE8C58yaVGZHJZcKUWdmkK62+0gRFUKmZQ3gRdeKo2appHKoKMmLC3/QPd5l5nsrsOedowx75SUsrwULgghTLnyahx6rmGfwDHOzTXc3G9tWT5iVz/A1AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/d942956f6fd996ccd94ac94ad0315f0c/8ac56/calculadora-ipc-ine.webp 240w,
/static/d942956f6fd996ccd94ac94ad0315f0c/d3be9/calculadora-ipc-ine.webp 480w,
/static/d942956f6fd996ccd94ac94ad0315f0c/e46b2/calculadora-ipc-ine.webp 960w,
/static/d942956f6fd996ccd94ac94ad0315f0c/0a92e/calculadora-ipc-ine.webp 1002w&quot;
              sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/d942956f6fd996ccd94ac94ad0315f0c/8ff5a/calculadora-ipc-ine.png 240w,
/static/d942956f6fd996ccd94ac94ad0315f0c/e85cb/calculadora-ipc-ine.png 480w,
/static/d942956f6fd996ccd94ac94ad0315f0c/d9199/calculadora-ipc-ine.png 960w,
/static/d942956f6fd996ccd94ac94ad0315f0c/d69c4/calculadora-ipc-ine.png 1002w&quot;
            sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/d942956f6fd996ccd94ac94ad0315f0c/d9199/calculadora-ipc-ine.png&quot;
            alt=&quot;La calculadora IPC del INE&quot;
            title=&quot;La calculadora IPC del INE&quot;
            loading=&quot;lazy&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;i&gt;La calculadora del INE, hecha con las mejores tecnologías que el año 2008 puede ofrecer.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Como pueden ver, la página de la que me estoy inspirando cumple su propósito, pero encuentro que podría mejorarse. Por ejemplo, la parte donde se especifican los intervalos de fechas y el monto a convertir es muy pequeña comparada al contenedor donde salen los resultados. Además, el valor ajustado, que es el resultado que cualquier persona que considere que la pregunta “¿cuánto costaría el pasaje de micro en mayo de 1987 en plata de hoy?” es digna de hacerse busca, está “relegado” a un texto más pequeño que el porcentaje de variación que, aunque importante, considero que podría dejarse más en un segundo lugar.&lt;/p&gt;
&lt;p&gt;Volviendo a mi &lt;em&gt;app&lt;/em&gt;, me puse a trabajar y, una vez tuve configurado el proyecto Next.js con TypeScript y Tailwind CSS, empecé a ver cómo podría rescatar la información sobre la variación del IPC (Índice de Precios al Consumidor). Partí revisando la &lt;a href=&quot;https://www.ine.cl/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;página del INE&lt;/a&gt; en busca de alguna base de datos pública o algo, pero solo encontré las estadísticas desagregadas por tipo de bien o servicio en lugar del porcentaje de variación mensual y, ya que la estadística no es lo mío, decidí mejor probar con la misma API que usa la calculadora. Como quería evitar dentro de lo posible enviar repetidas consultas a su &lt;em&gt;endpoint&lt;/em&gt; estando la aplicación en producción, pensé en descargar una sola vez toda la información que pudiera, ponerla en algún tipo de base de datos e irla actualizando cada mes.&lt;/p&gt;
&lt;p&gt;Para tener una tabla propia con la variación mensual del IPC, creé un &lt;em&gt;script&lt;/em&gt; en Python que llamara de forma repetida a la API del INE, consultando por la variación de $ 1000 millones (para obtener una buena cantidad de decimales) mes a mes desde marzo de 1928. Habría usado un número más grande, pero la plataforma no me dejaba usar más de 10 dígitos (ugh). Luego, extraje la información en XML (doble ugh) y mandé todo a un archivo CSV, el cual copié en una planilla de Google Sheets. Decidí usar esto en lugar de desplegar un servidor base de datos real (profe Varas, perdóneme si lee esto xd) porque no necesitaba algo muy complejo para esta aplicación y porque iba a aprovechar la capacidad de Next.js de generar sitios estáticos en tiempo de compilación para insertar la tabla de IPC en la misma página, actualizándola sólo cuando se añada una nueva entrada cada mes. De esa manera puedo ofrecer resultados a medida que el usuario tipea sin usar una API externa.&lt;/p&gt;
&lt;p&gt;Con respecto al diseño, ocupé toda mi energía creativa en diseñar esta obra de arte:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 580px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/890d8b0feec1bd48dc7395010ded93e8/b6272/mi-calculadora-ipc.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 92.5%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAACwUlEQVQ4y41UaW/bMAz1//9N+zKs29B2PdM0V3PYsZ34vm35fCNlO3GHDZiAB5EU+URJpJQgBxh+1kkEBaBZEeYfOtYHC1vdxWyl4p30jWpjuT/h8e0DupMgLPq4MZ5nJchZ6MHGuAT2po+buxf8uJ/h/mWFL19vpX779I6756WcedOkGoiykYMI+8wAj2cyGG6GcyCQNkBaAzEFZW0vM0FCcySAo5PiaCfw0j6OOZhLCUlJKatE9LPlpzCdCFHRIcwaxEVLGfRIRCfBdt0KYNghyS35DHbOMM4bWNYZrutiOnJRQVNVZGkCQdlGWY3TyUBK+nSkuYCqHlAUObJSHrmFGxXwYkG71RJBWsGnM7KNZTsUsAgOpTDaGOw7+oVsIy7FH145uNwDZVP2Or8iz+vDGdujI++OTisxfWEZO8QrwVAuI9iRS6OsWnmkbnI8IQT2+z1WyyXCOJMldim34aUHQnwi3Gg23U2Jqm6IuIEoaylneYHt7oDFYgkvuNbhWCnMpfj5tDh7mY88Onppe8FYp1w+12aYyNfC7g151aFqOpR1B1G3KErKjo7OYHnUeb1s2Bcy5nqX3WfCuukut1bSfem6DoPgODYMwyD9SKVjoqnr4Vb7mH8SVk1P1nWdBI8wDDGbvWE+nyOOY7ld27YYlmXM/xEOuXqeh81mA03T4Pu+JBt9/k44+S2qupU0XdcOZVLANA3YtoWEsjuZJvI8Gwh7X47xRsJMZnh9ZdmTRUPg/myQCn4oyJZiOau43zu5noh28Pvj+xoFO6LetWL65/pfRHcyOTM0K8HhFEpZPUcSezOANuhnqvCRVBmLmRf4/7u5fZZ/H+P7/Su+kf7156P8B5/mH3hZ7PH8viN9gYfZGr9e11Bps7HIlUvr0A473cNyZ2JBWFH/csdsVEvaGNujK8FrTPww28iY6Y//G3zOrcZ6su5fAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/890d8b0feec1bd48dc7395010ded93e8/8ac56/mi-calculadora-ipc.webp 240w,
/static/890d8b0feec1bd48dc7395010ded93e8/d3be9/mi-calculadora-ipc.webp 480w,
/static/890d8b0feec1bd48dc7395010ded93e8/4fac6/mi-calculadora-ipc.webp 580w&quot;
              sizes=&quot;(max-width: 580px) 100vw, 580px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/890d8b0feec1bd48dc7395010ded93e8/8ff5a/mi-calculadora-ipc.png 240w,
/static/890d8b0feec1bd48dc7395010ded93e8/e85cb/mi-calculadora-ipc.png 480w,
/static/890d8b0feec1bd48dc7395010ded93e8/b6272/mi-calculadora-ipc.png 580w&quot;
            sizes=&quot;(max-width: 580px) 100vw, 580px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/890d8b0feec1bd48dc7395010ded93e8/b6272/mi-calculadora-ipc.png&quot;
            alt=&quot;Mi versión de la calculadora IPC&quot;
            title=&quot;Mi versión de la calculadora IPC&quot;
            loading=&quot;lazy&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;i&gt;Acepto ofertas como diseñador gráfico. No se peleen por mí.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;No es la aplicación más bonita del mundo, pero el formulario mismo es más grande y muestra el valor calculado en mayor tamaño, además de que es responsiva y compatible como PWA.&lt;/p&gt;
&lt;p&gt;Con respecto al uso, es simple de usar: definimos un intervalo de tiempo, un monto en el cuadro de texto y, a medida que escribimos, vamos obteniendo el resultado. Hice repetidas pruebas con la calculadora del INE para asegurarme de que los valores coinciden y lo logra perfectamente, aunque con cifras muy grandes los valores empiezan a diferir (no ocupé todos los decimales que me retornaba la API por temor a que hubiera artefactos producto de ser números de coma flotante).&lt;/p&gt;
&lt;p&gt;Si les interesa echarle una mirada, pueden visitarla haciendo clic &lt;a href=&quot;https://ipc.jorgejarai.xyz&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;aquí&lt;/a&gt; e instalarla como PWA si gustan. Además, el proyecto con el código que usé para la &lt;em&gt;app&lt;/em&gt; lo pueden encontrar &lt;a href=&quot;https://github.com/jorgejarai/calculadora-ipc&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;acá&lt;/a&gt;. Si tienen alguna duda o problema, no duden en contactarme o reportar un &lt;em&gt;bug&lt;/em&gt; o &lt;em&gt;pull request&lt;/em&gt; en el repositorio. ¡Hasta la próxima!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[[ES] Mi primer paquete en NPM]]></title><description><![CDATA[Explicando un poco sobre mi primer paquete NPM.]]></description><link>https://jorgejarai.github.io/posts/mi-primer-paquete-npm</link><guid isPermaLink="false">https://jorgejarai.github.io/posts/mi-primer-paquete-npm</guid><pubDate>Tue, 27 Apr 2021 14:53:00 GMT</pubDate><content:encoded>&lt;p&gt;Hace unos días, después de pasar un buen rato programando y corrigiendo algunos errores que cometí en el camino, ¡finalmente publiqué mi primer paquete NPM!&lt;/p&gt;
&lt;p&gt;Mi pequeña creación se llama &lt;code class=&quot;language-text&quot;&gt;react-rut-formatter&lt;/code&gt; y básicamente implementa un &lt;em&gt;hook&lt;/em&gt; que se encarga de darle formato a un número de RUT (Rol Único Tributario) o RUN (Rol Único Nacional), que son utilizados en Chile como números de identidad para fines personales o tributarios. Todo con el encanto de TypeScript incorporado, pues considero que hace mucho más placentero y predecible trabajar con JavaScript.&lt;/p&gt;
&lt;p&gt;Por lo general un número de RUT se escribe de la forma XX.XXX.XXX-X, donde el último carácter es un dígito de control (llamado acá &lt;em&gt;dígito verificador&lt;/em&gt;), que se calcula a partir de los demás números que lo anteceden. No es una operación muy compleja calcular aquel dígito ni darle formato (con separadores de miles y todo), pero encuentro que nunca estaría de más tener una librería a mano para que, a medida que un usuario escribe uno en un formulario, el número vaya siendo formateado automáticamente, algo muy habitual en ciertas aplicaciones web chilenas (que necesitan un RUT o RUN para identificar a sus usuarios).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/8e802e451b723b683b40b04c15f7a1df/react-rut-formatter-demo.gif&quot; alt=&quot;Demostración de react-rut-formatter&quot;&gt;&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;Demostración de `react-rut-formatter`&lt;/p&gt;
&lt;p&gt;El repositorio con el código está disponible en &lt;a href=&quot;https://github.com/jorgejarai/react-rut-formatter&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;GitHub&lt;/a&gt; y debería estar utilizable. Sin embargo, acepto cualquier comentario o problema en la sección de &lt;em&gt;Issues&lt;/em&gt;, pues es la primera vez que subo código que espero que más gente pueda utilizar y la experiencia manejando &lt;em&gt;bugs&lt;/em&gt; nunca está de más. También está publicado en &lt;a href=&quot;https://www.npmjs.com/package/react-rut-formatter&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;NPM&lt;/a&gt; y puede ser instalado utilizando su gestor de paquetes de preferencia (ya sea &lt;code class=&quot;language-text&quot;&gt;yarn&lt;/code&gt; o &lt;code class=&quot;language-text&quot;&gt;npm&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Pueden encontrar una demostración del paquete &lt;a href=&quot;https://codesandbox.io/s/react-rut-formatter-demo-f8570&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;aquí&lt;/a&gt;, por si les interesa verlo funcionando.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[[ES] Sintáxis básica de C++ (parte 3)]]></title><description><![CDATA[Uso básico de memoria y buenas prácticas con parámetros.]]></description><link>https://jorgejarai.github.io/posts/sintaxis-basica-cpp-parte-3</link><guid isPermaLink="false">https://jorgejarai.github.io/posts/sintaxis-basica-cpp-parte-3</guid><pubDate>Thu, 08 Apr 2021 14:53:00 GMT</pubDate><content:encoded>&lt;p&gt;Hola! En esta tercera parte de mi serie sobre sintaxis de C++, hablaré de dos detalles que son cruciales en mi opinión para conseguir programas eficientes que trabajen de la manera más óptima posible con las variables que utilizan en su código: cuándo utilizar la memoria dinámica (&lt;em&gt;heap&lt;/em&gt;) y cómo configurar los parámetros de una función para evitar copias innecesarias de recursos y evitar la sobreescritura de argumentos que, en principio, son sólo de entrada.&lt;/p&gt;
&lt;h2 id=&quot;variables-y-memoria&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#variables-y-memoria&quot; aria-label=&quot;variables y memoria permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Variables y memoria&lt;/h2&gt;
&lt;p&gt;En esta sección vamos a ver un tema que creo que es importante y es dejado a un lado a mi parecer: ¿en qué parte de la memoria deberíamos guardar las variables con las que trabajamos? ¿En la pila (&lt;em&gt;stack&lt;/em&gt;) o en el montículo (&lt;em&gt;heap&lt;/em&gt;, memoria dinámica)?&lt;/p&gt;
&lt;p&gt;Tanto &lt;em&gt;stack&lt;/em&gt; como &lt;em&gt;heap&lt;/em&gt; funcionan de forma diferente al momento de asignar o liberar memoria. En el caso del &lt;em&gt;stack&lt;/em&gt;, el sistema operativo asigna una cantidad de memoria a cada proceso para que en él guarde la pila de llamadas (&lt;em&gt;call stack&lt;/em&gt;) y las variables locales que cada función pudiera tener. No es una cantidad excesivamente grande (unos cuantos megabytes), pero es suficiente para que un programa pueda alcanzar una buena profundidad de llamadas sin colapsar. El &lt;em&gt;heap&lt;/em&gt; es una historia diferente. En este caso podemos pensar literalmente en un montículo lleno de bytes disponibles que se van asignando a los diferentes procesos según lo requieran. Cuando un programa solicita memoria al &lt;em&gt;heap&lt;/em&gt; (usando internamente la función &lt;code class=&quot;language-text&quot;&gt;malloc&lt;/code&gt; en sistemas UNIX), este recibe a cambio un puntero ubicando en algún sector de la memoria los bytes que solicitamos. Cuando ya se hizo uso de la memoria, esta se devuelve al montículo (función &lt;code class=&quot;language-text&quot;&gt;free&lt;/code&gt;) para que otros procesos puedan utilizarla. Tanto &lt;em&gt;stack&lt;/em&gt; como &lt;em&gt;heap&lt;/em&gt; son memoria RAM al fin y al cabo, ¿verdad? Entonces, ¿debiera importarme en cuál de ellas guardo mi información? Absolutamente.&lt;/p&gt;
&lt;p&gt;Aunque en la práctica ambas van a ser igual de rápidas y eficientes, para el programador debe ser importante hacer un buen uso de estas, especialmente considerando que el &lt;em&gt;stack&lt;/em&gt; tiene una capacidad limitada (en mi sistema son 8 MiB, para que se hagan una idea) y, al menos en C++, el &lt;em&gt;heap&lt;/em&gt; requiere trabajar con punteros, algo que hasta para el programador más avezado podría significar varios dolores de cabeza.&lt;/p&gt;
&lt;p&gt;Una regla que deberían considerar cuando programen es usar punteros la menor cantidad de veces posible, porque aunque sepan al revés y al derecho cómo usarlos, nunca va a faltar la ocasión en que usen &lt;code class=&quot;language-text&quot;&gt;.&lt;/code&gt; en lugar de &lt;code class=&quot;language-text&quot;&gt;-&gt;&lt;/code&gt;, terminen con errores de compilación incomprensibles y vean que el programa se la pasa tirando fallos de segmentación porque también les faltó desreferenciar su puntero a alguna estructura y el programa empezó a volverse loco. Lo ideal sería trabajar con punteros sólo cuando tengan que implementar estructuras de datos (como listas, vectores o mapas) y el resto de las ocasiones usar &lt;em&gt;smart pointers&lt;/em&gt; (un tipo de objeto que implementa una interfaz más ordenada y menos proclive a errores para trabajar con punteros a memoria). Más adelante podremos ver cómo se utilizan y cuándo.&lt;/p&gt;
&lt;p&gt;Entonces, yendo al grano, ¿cuándo deberíamos usar el heap o el stack? En el caso del &lt;em&gt;stack&lt;/em&gt;, podemos utilizarlo con calma cuando trabajemos con arreglos pequeños de tipos pequeños (un arreglo de enteros, de caracteres), estructuras que no tengan un gran tamaño o clases tambien pequeñas:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; numeros&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; nombre&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; num&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; tipo&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; peque&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Esta notación permite definir una estructura al&lt;/span&gt;
         &lt;span class=&quot;token comment&quot;&gt;// mismo tiempo que creamos una variable de ese tipo&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;double&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Variables comunes y corrientes como esta&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;// ya se almacenan en el stack&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// La clase que creamos anteriormente&lt;/span&gt;
Persona &lt;span class=&quot;token function&quot;&gt;nic&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Nicholas Cage&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;57&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// INNECESARIO&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Solo ocupa 28 bytes (x86 modernos)&lt;/span&gt;
Persona &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;keanu &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Persona&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Keanu Reeves&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;56&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Una excepción a esto son tipos como &lt;code class=&quot;language-text&quot;&gt;std::string&lt;/code&gt; o &lt;code class=&quot;language-text&quot;&gt;std::vector&lt;/code&gt;, los cuales solicitan ellos mismos memoria al &lt;em&gt;heap&lt;/em&gt; y cuyo tamaño como tal solo corresponde a punteros y números que almacenan información sobre los datos que almacenan:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string saludo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;¡Hola, mundo!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;vector primos&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// INNECESARIO&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Tanto ctor como dtor de std::list&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ya contemplan solicitar memoria&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// del heap&lt;/span&gt;
std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;list&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;lista &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Luego, con respecto al &lt;em&gt;heap&lt;/em&gt;, donde brilla es utilizándolo para almacenar grandes cantidades de información, ya sea un gran número de estructuras pequeñas, un número reducido de estructuras enormes o cualquier otra monstruosidad que su programa necesite:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Definitivamente así no es cómo un juego guarda una textura,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// pero en memoria esto va a ocupar ~196 KiB, así que de&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// guardarse en el stack lo vamos a llenar bien rápido.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Por tanto, nos sirve para el ejemplo&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Textura&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; g&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Esto va a ocupar ~4 MiB de memoria, así que, de guardarse&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// en el stack, este no podría aguantar muchas variables&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// como esta&lt;/span&gt;
Textura &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;mapa_texs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; Textura&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;coefs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 8 KiB de memoria&lt;/span&gt;

Textura &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;jugador &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Textura&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// No se olviden de liberar la memoria que usen, especialmente&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// si el programa va a seguir corriendo después de hacerlo!&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; mapa_texs&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; coefs&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt; jugador&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Insisto en que manejen bien estas reglas e idealmente investiguen también por cuenta propia cómo funciona lo que explico, porque los malos hábitos nunca mueren y, cuando menos se lo esperen, el proyecto en el que han trabajado por meses empezó a dejar de funcionar porque o llenaron el &lt;em&gt;stack&lt;/em&gt; de su programa o el &lt;em&gt;heap&lt;/em&gt; ya no tiene espacio para asignar 500 MiB porque ya asignaron chorrocientos elementos de 10 bytes cada uno (creo que esto último no es algo plausible, pero más vale prevenir que lamentar).&lt;/p&gt;
&lt;h2 id=&quot;uso-adecuado-de-parámetros&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#uso-adecuado-de-par%C3%A1metros&quot; aria-label=&quot;uso adecuado de parámetros permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Uso adecuado de parámetros&lt;/h2&gt;
&lt;p&gt;Tengo que confesarles algo, buena parte de los ejemplos de código que he entregado no son idóneos realmente. Quiero decir que funcionan como tal, pero he omitido deliberadamente algunos detalles con respecto a algunas variables para motivos de simplicidad. Aquí voy a enmendar mi “error” y les explicaré cómo esperar parámetros adecuadamente en una función y cómo utilizar los &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; basados en rango de forma adecuada desde un punto de vista de memoria, ¡todo en un Solo Cómodo Paquete™! ¡Llame ahora, mientras nuestras operadoras no estén ocupadas!&lt;/p&gt;
&lt;h3 id=&quot;parámetros-y-argumentos&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#par%C3%A1metros-y-argumentos&quot; aria-label=&quot;parámetros y argumentos permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Parámetros y argumentos&lt;/h3&gt;
&lt;p&gt;Antes de empezar, les cuento una cosita. No es una regla escrita en piedra, pero por lo general se le denomina &lt;em&gt;parámetros&lt;/em&gt; a la lista de variables que una función lleva en su huella (o &lt;em&gt;signature&lt;/em&gt;) al momento de definirla, mientras que &lt;em&gt;argumentos&lt;/em&gt; se llaman los valores que se le entregan a una función cuando se invoca.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Aquí se llaman parámetros&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;123&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Y aquí argumentos&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;No es una convención que la totalidad de los programadores siga, pero nunca está de más saberlo.&lt;/p&gt;
&lt;h3 id=&quot;¿cómo-definimos-los-parámetros-entonces&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%C2%BFc%C3%B3mo-definimos-los-par%C3%A1metros-entonces&quot; aria-label=&quot;¿cómo definimos los parámetros entonces permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;¿Cómo definimos los parámetros, entonces?&lt;/h3&gt;
&lt;p&gt;Muy simple. Esta tabla que tienen a continuación explica bien cómo definir los tipos de cada variable según las circunstancias en las que los usen:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 784px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 32.49999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABYklEQVQY002QWU/CQBSF+8eNTVwoEQ1GfXMBlEWLCBESJVHWKlXWUtqytJ3pQIFSUIwPLiR6CZE4+WZy5uTe83Con78ztF57/Yk5eDG6toYsTGxMRguQsXgtEPMBYoMgvTG1XD46SzHumGs/vu66op3hrb1rhzu6sROlGZZ2sjQTXtm8WGXC2weJNVfE4Y4xuzHq4/PrezaDm0hWPMFMMMJ5Q1lvKONn875Q9vD0zhNMAyeBtCeQ9p1nA5fcsT/lZ3MwRsmKPrSm1mja7Ji1Bq5LhtDAtQYCXRbUdK5UExE4c1NEokJAFIotoFTVKElWrdGbPX5vqaYgGaI8R5CwKJOqqD/wIsQtAR8iqiKq1HX4Uh2th/CAdK2yoCdueYh8rqi5gszxSvK+FL95TKbK3FMzz8t5XgE4vgnkC0qh2KbabV3VMCGm2Z909D7p2V1zDMVCvRoadDRTw8Nl7f/7J137F0lQVS6Nyw0gAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/728daf82ddc007475f71fb3b2990408e/8ac56/cpp-parameters-table.webp 240w,
/static/728daf82ddc007475f71fb3b2990408e/d3be9/cpp-parameters-table.webp 480w,
/static/728daf82ddc007475f71fb3b2990408e/2a3bb/cpp-parameters-table.webp 784w&quot;
              sizes=&quot;(max-width: 784px) 100vw, 784px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/728daf82ddc007475f71fb3b2990408e/8ff5a/cpp-parameters-table.png 240w,
/static/728daf82ddc007475f71fb3b2990408e/e85cb/cpp-parameters-table.png 480w,
/static/728daf82ddc007475f71fb3b2990408e/4971b/cpp-parameters-table.png 784w&quot;
            sizes=&quot;(max-width: 784px) 100vw, 784px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/728daf82ddc007475f71fb3b2990408e/4971b/cpp-parameters-table.png&quot;
            alt=&quot;Tabla que indica cómo definir los tipos de los parámetros según cómo los usen&quot;
            title=&quot;Tabla que indica cómo definir los tipos de los parámetros según cómo los usen&quot;
            loading=&quot;lazy&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;i&gt;Cortesía de &lt;a href=&quot;https://www.modernescpp.com/index.php/c-core-guidelines-how-to-pass-function-parameters&quot;&gt;Modernes C++&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;De todos modos, explicaré caso a caso cuándo se usa cuál.&lt;/p&gt;
&lt;h4 id=&quot;parámetros-de-entrada-in&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#par%C3%A1metros-de-entrada-in&quot; aria-label=&quot;parámetros de entrada in permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Parámetros de entrada (in)&lt;/h4&gt;
&lt;p&gt;Este es el caso más usual que se van a encontrar. Ocurre cuando entregan un valor para que la función lo consuma sin preocuparse de retornarlo a través del mismo:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;imprimir_texto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;imprimir_texto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hola\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Acá podemos ver dos cosas: primero, que estamos pasando &lt;code class=&quot;language-text&quot;&gt;str&lt;/code&gt; como una referencia (&lt;code class=&quot;language-text&quot;&gt;&amp;amp;&lt;/code&gt;), lo que quiere decir que no estamos duplicando la variable que entregamos al invocar &lt;code class=&quot;language-text&quot;&gt;imprimir_texto&lt;/code&gt; (estamos trabajando con el mismo literal &lt;code class=&quot;language-text&quot;&gt;&quot;Hola\n&quot;&lt;/code&gt; sin hacer una copia de él). Además, al definirlo como &lt;code class=&quot;language-text&quot;&gt;const&lt;/code&gt;, nos aseguramos de que no vamos a editar innecesariamente a &lt;code class=&quot;language-text&quot;&gt;str&lt;/code&gt;, pues no es el objeto de esta función. Usar &lt;code class=&quot;language-text&quot;&gt;const&lt;/code&gt; o no no afecta su código, sino que simplemente le dice al compilador que esté atento a que la variable no puede reasignarse.&lt;/p&gt;
&lt;p&gt;Este comportamiento de no duplicación no ocurre si omitimos el &lt;code class=&quot;language-text&quot;&gt;&amp;amp;&lt;/code&gt;, lo que puede ser una &lt;strong&gt;muy mala idea&lt;/strong&gt; si estamos trabajando con variables muy grandes;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string texto_muy_largo&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Imaginemos que texto_muy_largo contiene un archivo&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// de texto de 5 MiB y queremos imprimirlo en pantalla.&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;imprimir_texto_mal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string str&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// En este caso, vamos a trabajar sobre la variable&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// misma sin duplicarla, lo que nos ahorra tiempo&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// y memoria&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;imprimir_texto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;texto_muy_largo&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// En cambio, acá estamos haciendo lo mismo, pero&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// de forma más ineficiente, pues estamos duplicando&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// el contenido de texto_muy_largo en otra variable&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// (el parámetro que recibe la función), lo que&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// implica desperdiciar memoria y tiempo copiando&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// los contenidos del string&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;imprimir_texto_mal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;texto_muy_largo&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Todo esto que expliqué aplica únicamente para tipos que no son baratos de copiar o que simplemente no se pueden copiar (como &lt;code class=&quot;language-text&quot;&gt;std::unique_ptr&lt;/code&gt;, que veremos prontamente). Tipos primitivos como &lt;code class=&quot;language-text&quot;&gt;int&lt;/code&gt; o &lt;code class=&quot;language-text&quot;&gt;boolean&lt;/code&gt; son baratísimos de copiar, por lo que la optimización de usar &lt;code class=&quot;language-text&quot;&gt;&amp;amp;&lt;/code&gt; cuando son parámetros de entrada es innecesaria:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Bien: Barato porque es una referencia a constante&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;f1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Mal: Puede ser muy costoso si el string es muy&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// grande&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;f2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string s&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// OK: Imbatible. Podría hasta ser copiado en un&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// registro de CPU&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;f3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Innecesario: Implica una sobrecarga extra para&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// convertir la referencia en un valor&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;f4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;parámetros-de-salida-out&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#par%C3%A1metros-de-salida-out&quot; aria-label=&quot;parámetros de salida out permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Parámetros de salida (out)&lt;/h4&gt;
&lt;p&gt;Con parámetro de salida me refiero a aquel que, en vez de ser usado para que la función reciba datos, es usado para retornar información al programador. Esto incluye también al valor de retorno de la función en cierto modo.&lt;/p&gt;
&lt;p&gt;La mayoría de las veces va a ser posible retornar información como parte del retorno de una función sin mayor problema:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Todo esto está bien&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;f5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;            &lt;span class=&quot;token comment&quot;&gt;// Se entrega en el stack&lt;/span&gt;
std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string &lt;span class=&quot;token function&quot;&gt;f6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;// Ídem. El contenido del string se&lt;/span&gt;
                        &lt;span class=&quot;token comment&quot;&gt;// mantiene en el heap.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En estos casos corren ciertas optimizaciones que permiten que retornar objetos como un &lt;code class=&quot;language-text&quot;&gt;std::string&lt;/code&gt; no implique un mayor costo para el programa, así que si tienen que retornar uno como en &lt;code class=&quot;language-text&quot;&gt;f6&lt;/code&gt;, pueden hacerlo como si fuera un tipo primitivo más.&lt;/p&gt;
&lt;p&gt;Sin embargo, existe una excepción que, aunque no es algo muy frecuente, vale tener en consideración. Si trabajan con estructuras grandes como esta:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Packet&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; header&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; payload&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;pueden encontrarse con problemas si definen una función como &lt;code class=&quot;language-text&quot;&gt;Packet gen_paquete()&lt;/code&gt;, pues retornar más de 4 KiB en el stack puede ser ineficiente, especialmente si se tratara de un arreglo de &lt;code class=&quot;language-text&quot;&gt;Packet&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Entonces, ¿qué hacemos para retornar estructuras enormes como esta? Aquí vamos a hacer uso de las referencias no constantes:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;gen_paquete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Packet&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt; packet&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Acá, en vez de retornar el paquete de la forma tradicional, lo que hacemos es definir uno vacío y que sea la función la que lo rellene, esto gracias a que estamos trabajando con una copia por referencia. Así, esta función puede ejecutarse de este modo;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;Packet p&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Sus arreglos van a estar no inicializados&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;gen_paquete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Acá los inicializamos&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Ya en este punto la variable p contiene valores válidos&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ya con esto tenemos definidos la mayoría de los casos en que van a encontrarse con parámetros en una función. Existen otros más, los que pueden ver si abren el enlace de donde conseguí la tabla, pero considero que estos son los esenciales y los que importa saber si aún no conocen conceptos más avanzados del lenguaje.&lt;/p&gt;
&lt;h3 id=&quot;adenda-for-basados-en-rango&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#adenda-for-basados-en-rango&quot; aria-label=&quot;adenda for basados en rango permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Adenda: &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; basados en rango&lt;/h3&gt;
&lt;p&gt;Considerando lo que hemos visto, si están trabajando con bucles &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; basados en rango, es posible también usar referencias en estas, especialmente si piensan editar los valores que reciben en cada iteración, como pueden ver en este ejemplo:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;vector&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; nums&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt; num &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; nums&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    num &lt;span class=&quot;token operator&quot;&gt;*=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Saliendo del bucle, veremos que nums&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ahora contiene los números {2, 4,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 6, 8, 10};&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Con valores chicos como &lt;code class=&quot;language-text&quot;&gt;int&lt;/code&gt;, no debería ser necesario usar referencias si no van a modificarlos, pero, sin embargo, recomiendo encarecidamente usar &lt;code class=&quot;language-text&quot;&gt;const&lt;/code&gt; para evitar posibles &lt;em&gt;bugs&lt;/em&gt; si terminan editando el valor involuntariamente:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; num &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; nums&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    nun &lt;span class=&quot;token operator&quot;&gt;*=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// En este caso el compilador&lt;/span&gt;
              &lt;span class=&quot;token comment&quot;&gt;// saltará con un error&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Con esto terminamos esta entrega de mi ahora ya serie sobre sintaxis básica de C++. Espero verlos en la próxima entrega. ¡Hasta pronto!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[[ES] Sintáxis básica de C++ (parte 2)]]></title><description><![CDATA[Clases, constructores, destructores y contenendores de la STL.]]></description><link>https://jorgejarai.github.io/posts/sintaxis-basica-cpp-parte-2</link><guid isPermaLink="false">https://jorgejarai.github.io/posts/sintaxis-basica-cpp-parte-2</guid><pubDate>Thu, 18 Mar 2021 00:34:00 GMT</pubDate><content:encoded>&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id=&quot;clases&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#clases&quot; aria-label=&quot;clases permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Clases&lt;/h2&gt;
&lt;p&gt;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 &lt;code class=&quot;language-text&quot;&gt;.h&lt;/code&gt; o &lt;code class=&quot;language-text&quot;&gt;.hpp&lt;/code&gt;), que define su estructura, y un archivo fuente (&lt;code class=&quot;language-text&quot;&gt;.cpp&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;.cxx&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;.cc&lt;/code&gt;, entre otras; queda a gusto del programador cuál usar), que implementa el código definido por la estructura.&lt;/p&gt;
&lt;p&gt;El archivo de cabecera de una clase puede verse de la siguiente forma:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// persona.h&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Estas líneas (llamadas directrices de preprocesador,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// que, en este caso, forman un &quot;include guard&quot;) le&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// indican al compilador que lea este archivo sólo&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// una vez, en caso de que sea utilizado en más de un sitio.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Todo archivo .h debiera utilizarlas&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;ifndef&lt;/span&gt; &lt;span class=&quot;token expression&quot;&gt;PERSONA_H&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;define&lt;/span&gt; &lt;span class=&quot;token macro-name&quot;&gt;PERSONA_H&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Una alternativa no estándar pero soportada por la&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// mayoría de los compiladores es #pragma once. Si usaran&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// esta forma, omitan el include guard (las líneas que parten&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// con #ifndef y #define y la línea #endif al final del&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// documento). Solo deberían usar una de estas a la vez.&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;pragma&lt;/span&gt; &lt;span class=&quot;token expression&quot;&gt;once&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;string&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Una clase puede tener miembros:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   - públicos (accesibles por cualquiera)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   - privados (accesibles sólo por la clase misma)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   - protegidos (accesibles sólo por la clase&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//     misma y sus subclases)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Persona&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Estos no podrán ser accedidos desde fuera de la clase.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Si tuviéramos una instancia de Persona llamada p,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// escribir p.nombre va a generar un error de compilación&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Tanto nombre como edad se denominan atributos&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// (o campos). Funcionan como variables, las cuales&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// serán únicas para cada instancia de Persona (es&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// decir, cada persona tendrá su propio nombre y edad)&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string nombre&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; edad&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// En cambio, estos pueden utilizarse desde fuera y funcionan&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// como la cara visible de la clase&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Este es el constructor (puede haber más de uno), donde&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// se inicializa cada instancia de la clase, se definen&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// sus valores iniciales, entre otras cosas. Un&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// constructor no especifica un tipo de retorno.&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;Persona&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string nombre&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; edad&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Estas funciones se denominan métodos. Los métodos&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// pueden acceder a los atributos de cada instancia y&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// trabajar con estos.&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string &lt;span class=&quot;token function&quot;&gt;get_nombre&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_edad&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;endif&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// PERSONA_H      Omitir si usan #pragma once&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// clase.cpp&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// En este archivo vamos a implementar tanto el&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// constructor como los dos métodos que están definidos&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// en el archivo de cabecera.&lt;/span&gt;

&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;persona.h&quot;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Para implementar los métodos de una clase,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// anteponemos al nombre de cada uno el de la clase,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// seguido de ::&lt;/span&gt;
&lt;span class=&quot;token class-name&quot;&gt;Persona&lt;/span&gt;&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Persona&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string nombre&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; edad&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nombre&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nombre&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;edad&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;edad&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Esta de arriba es una notación especial que nos&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// permite asignar directamente el valor de cada&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// argumento con un atributo de la clase (en este&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// caso, el atributo nombre recibe el valor del&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// parámetro del mismo nombre; lo mismo con edad)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Podemos hacer esto en lugar de la forma&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// anterior si gustan&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// this-&gt;nombre = nombre;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// this-&gt;edad = edad;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// El puntero this nos permite acceder a todos los&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// atributos de la instancia actual de la clase.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// La usamos en este caso para evitar ambigüedades&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// (ya que atributo y parámetro se llaman igual)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string &lt;span class=&quot;token class-name&quot;&gt;Persona&lt;/span&gt;&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get_nombre&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Como en este caso no hay otro elemento llamado&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// nombre en la función, podemos prescindir del&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// this-&gt; con seguridad&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; nombre&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Persona&lt;/span&gt;&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get_edad&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; edad&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// main.cpp&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Los archivos de cabecera que son parte del proyecto&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// debieran ser incluidos usando comillas dobles (&quot;&quot;),&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// mientras que las librerías de sistema con &amp;lt;&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;iostream&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;persona.h&quot;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Así creamos una instancia cuyo atributo&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// nombre contendrá el string &quot;Juan López&quot;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// y edad el número 40. Noten que los argumentos&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// dados coinciden con los parámetros definidos&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// en persona.cpp y persona.h&lt;/span&gt;
    Persona &lt;span class=&quot;token function&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Juan López&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get_nombre&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; tiene &quot;&lt;/span&gt;
              &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get_edad&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; años.\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Retornamos 0 para indicar que el programa&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// se ejecutó exitosamente&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Podríamos compilar el programa con esta llamada a &lt;code class=&quot;language-text&quot;&gt;g++&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;g++ -o prueba_persona main.cpp persona.cpp&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si desean mantener los archivos de cabecera y fuente separados, pueden hacer uso
de esta estructura de archivos:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;prueba_persona/
 |-- src/                 Archivos fuente
 |    |- main.cpp
 |    \- persona.cpp
 \-- include/             Archivos de cabecera
      \- persona.h&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Para compilar, pueden usar este comando (asegurándose de estar en la carpeta &lt;code class=&quot;language-text&quot;&gt;prueba_persona&lt;/code&gt;):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;g++ -o prueba_persona src/main.cpp src/persona.cpp -I include/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El argumento &lt;code class=&quot;language-text&quot;&gt;-I &amp;lt;carpeta&gt;&lt;/code&gt; le indica al compilador dónde tiene que buscar los archivos &lt;code class=&quot;language-text&quot;&gt;.h&lt;/code&gt; que hemos creado, ya que no están en la misma carpeta que los &lt;code class=&quot;language-text&quot;&gt;.cpp&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;constructores-y-destructores&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#constructores-y-destructores&quot; aria-label=&quot;constructores y destructores permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Constructores y destructores&lt;/h3&gt;
&lt;p&gt;Antes de continuar, me quiero detener un momento para explicar un poco más sobre los contenedores y destructores, también llamados &lt;em&gt;ctor(s)&lt;/em&gt; y &lt;em&gt;dtor(s)&lt;/em&gt; (a partir de los términos &lt;em&gt;constructor(s)&lt;/em&gt; y &lt;em&gt;destructor(s)&lt;/em&gt; 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 &lt;em&gt;scope&lt;/em&gt; o se invoca a &lt;code class=&quot;language-text&quot;&gt;delete&lt;/code&gt;, respectivamente (veremos estos últimos dos casos en detalle después).&lt;/p&gt;
&lt;h4 id=&quot;constructores&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#constructores&quot; aria-label=&quot;constructores permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Constructores&lt;/h4&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Clase&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string nombre&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; edad&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;Clase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;Clase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string nombre&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; edad&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token class-name&quot;&gt;Clase&lt;/span&gt;&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Clase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nombre&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;edad&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token class-name&quot;&gt;Clase&lt;/span&gt;&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Clase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string nombre&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; edad&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nombre&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nombre&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;edad&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;edad&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, podemos ver que &lt;code class=&quot;language-text&quot;&gt;Clase(std::string, unsigned)&lt;/code&gt; asignará el nombre y edad que le entregamos a los atributos del mismo nombre, lo que es usual. Con respecto a &lt;code class=&quot;language-text&quot;&gt;Clase()&lt;/code&gt;, lo que ocurrirrá es que tanto &lt;code class=&quot;language-text&quot;&gt;nombre&lt;/code&gt; como &lt;code class=&quot;language-text&quot;&gt;edad&lt;/code&gt; se definan como &lt;code class=&quot;language-text&quot;&gt;&quot;&quot;&lt;/code&gt; y &lt;code class=&quot;language-text&quot;&gt;0&lt;/code&gt;, respectivamente. Ambas definiciones son válidas y no producen conflictos entre sí, ya que los parámetros que esperan son diferentes (ninguno contra un &lt;code class=&quot;language-text&quot;&gt;std::string&lt;/code&gt; y un &lt;code class=&quot;language-text&quot;&gt;unsigned&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Si, por ejemplo, &lt;code class=&quot;language-text&quot;&gt;Clase&lt;/code&gt; también contuviera un puntero bruto a memoria, podríamos inicializarlo haciendo uso de &lt;code class=&quot;language-text&quot;&gt;malloc&lt;/code&gt; o &lt;code class=&quot;language-text&quot;&gt;free&lt;/code&gt; dentro del constructor, sin olvidarse de liberar los recursos solicitados en el destructor, que es lo que veremos a continuación.&lt;/p&gt;
&lt;h4 id=&quot;destructores&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#destructores&quot; aria-label=&quot;destructores permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Destructores&lt;/h4&gt;
&lt;p&gt;Cuando nuestra instancia se sale de &lt;em&gt;scope&lt;/em&gt; o ejecutamos &lt;code class=&quot;language-text&quot;&gt;delete&lt;/code&gt;, 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:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ClaseConDtor&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string str&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;ClaseConDtor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ClaseConDtor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Este es nuestro destructor.&lt;/span&gt;
                     &lt;span class=&quot;token comment&quot;&gt;// Un destructor nunca recibe&lt;/span&gt;
                     &lt;span class=&quot;token comment&quot;&gt;// argumentos&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    ClaseConDtor &lt;span class=&quot;token function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Creamos una instancia&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Al momento de abandonar el if, el destructor&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// es llamado automáticamente. El atributo str&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// también invoca al suyo y libera la memoria&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// que utilizaba el string&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ClaseConDtorMem&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;ClaseConDtorMem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ClaseConDtorMem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Creamos una instancia en el heap&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// (traten de usar punteros lo menos posible, insisto)&lt;/span&gt;
ClaseConDtorMem &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ClaseConDtorMem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Aquí invocamos al destructor de nuestra&lt;/span&gt;
          &lt;span class=&quot;token comment&quot;&gt;// clase. Una vez hecho, la memoria que&lt;/span&gt;
          &lt;span class=&quot;token comment&quot;&gt;// solicitó es devuelta al SO&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;em&gt;string&lt;/em&gt; de &lt;code class=&quot;language-text&quot;&gt;ClaseConDtor&lt;/code&gt;) 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.&lt;/p&gt;
&lt;h2 id=&quot;contenedores&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#contenedores&quot; aria-label=&quot;contenedores permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Contenedores&lt;/h2&gt;
&lt;p&gt;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++.&lt;/p&gt;
&lt;h3 id=&quot;arreglos-dinámicos-stdvector&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#arreglos-din%C3%A1micos-stdvector&quot; aria-label=&quot;arreglos dinámicos stdvector permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Arreglos dinámicos (&lt;code class=&quot;language-text&quot;&gt;std::vector&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Esta es uno de los contenedores más simples de usar y el que más se van a encontrar. &lt;code class=&quot;language-text&quot;&gt;std::vector&lt;/code&gt; implementa un arreglo de tamaño variable que se encarga de forma automática de agrandar la estructura subyacente que almacena la información:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Este arreglo es de tamaño fijo. Podemos&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// alterar los números que ya contiene, pero&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// no podemos agregarle ni quitarle celdas.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; nums&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

nums&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// A menos que quieran que su programa&lt;/span&gt;
              &lt;span class=&quot;token comment&quot;&gt;// falle o no compile, no hagan esto.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;iostream&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;vector&gt;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Tenemos que incluir esta librería&lt;/span&gt;&lt;/span&gt;
                  &lt;span class=&quot;token comment&quot;&gt;// para usar vectores&lt;/span&gt;

&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;persona.h&quot;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Como nums2 es un vector, podemos alterar los números&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// que contiene, agregar y eliminar a libertad.&lt;/span&gt;
std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;vector&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; nums2&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

nums2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push_back&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Así agregamos un número al final&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; trece &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; nums2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pop_back&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Y así lo eliminamos&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Así podemos obtener el tamaño del vector&lt;/span&gt;
std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; nums2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;endl&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Así inicializamos un vector vacío&lt;/span&gt;
std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;vector&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Persona&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; gente&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Y así podemos construir &quot;in situ&quot; una instancia,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// si es que el tipo es construible. Tan solo tenemos&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// que pasar los mismos parámetros que de costumbre.&lt;/span&gt;
gente&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;emplace_back&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Alan Turing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;41&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Eso es equivalente a esto:&lt;/span&gt;
Persona &lt;span class=&quot;token function&quot;&gt;alan&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Alan Turing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;41&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gente&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push_back&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;alan&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Si queremos limpiar el vector, llamamos a clear()&lt;/span&gt;
gente&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clear&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Para comprobar que lo limpiamos, podemos usar&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// el método empty() o chequear que size() == 0&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gente&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Vacío&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;endl&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// if (gente.size() == 0) {&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//    std::cout &amp;lt;&amp;lt; &quot;Vacío&quot; &amp;lt;&amp;lt; std::endl;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// }&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;listas-enlazadas-stdlist&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#listas-enlazadas-stdlist&quot; aria-label=&quot;listas enlazadas stdlist permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Listas enlazadas (&lt;code class=&quot;language-text&quot;&gt;std::list&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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):&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 771px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 30%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAApElEQVQY05WOyxJEMBBF/f+3WduxIIgqJMQjocgcMaqmZucsUrc7fW935Jyz1hZFUdd1VVVlWc7zrLVGCCGklLzbtskAmjHEvu/neUZN09Aax7ELTNOUJEmWZcYYyrZt+YrjGEFi95DnOWVEAKvwK6V0ABsG9TAMA4k074G+79HHcVybvfdcxTHc719ymck2ATR5v+/NPfpXfs3LsqRpuq7r280fFzVYs7tpHe0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/d38a72319f20c4edb8362a83da2d3126/8ac56/doubly-linked-list.webp 240w,
/static/d38a72319f20c4edb8362a83da2d3126/d3be9/doubly-linked-list.webp 480w,
/static/d38a72319f20c4edb8362a83da2d3126/d5234/doubly-linked-list.webp 771w&quot;
              sizes=&quot;(max-width: 771px) 100vw, 771px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/d38a72319f20c4edb8362a83da2d3126/8ff5a/doubly-linked-list.png 240w,
/static/d38a72319f20c4edb8362a83da2d3126/e85cb/doubly-linked-list.png 480w,
/static/d38a72319f20c4edb8362a83da2d3126/5d030/doubly-linked-list.png 771w&quot;
            sizes=&quot;(max-width: 771px) 100vw, 771px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/d38a72319f20c4edb8362a83da2d3126/5d030/doubly-linked-list.png&quot;
            alt=&quot;Una lista doblemente enlazada&quot;
            title=&quot;Una lista doblemente enlazada&quot;
            loading=&quot;lazy&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;i&gt;Cortesía de &lt;a href=&quot;https://www.studytonight.com/code/python/ds/doubly-linked-list-introduction-insertion.php&quot;&gt;Studytonight&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;list&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Una lista doblemente enlazada&lt;/span&gt;
std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;list&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; lista&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

lista&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push_back&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Ahora la lista queda&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 1 &amp;lt;-&gt; 2 &amp;lt;-&gt; 3 &amp;lt;-&gt; 4 &amp;lt;-&gt; 5 &amp;lt;-&gt; 6&lt;/span&gt;

lista&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push_front&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Ahora la lista queda&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 7 &amp;lt;-&gt; 1 &amp;lt;-&gt; 2 &amp;lt;-&gt; 3 &amp;lt;-&gt; 4 &amp;lt;-&gt; 5 &amp;lt;-&gt; 6&lt;/span&gt;

lista&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pop_back&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
lista&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pop_back&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
lista&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pop_front&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Finalmente:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 1 &amp;lt;-&gt; 2 &amp;lt;-&gt; 3 &amp;lt;-&gt; 4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como es posible recorrer una lista doblemente enlazada de atrás hacia adelante, podemos iterar un &lt;code class=&quot;language-text&quot;&gt;std::list&lt;/code&gt; en reversa, algo que veremos con detalle en otra ocasión:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;list&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; fibonacci&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Iteración regular (de inicio a fin)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; fibonacci&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;endl&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Iteración en reversa&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;auto&lt;/span&gt; it &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; fibonacci&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rbegin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;auto&lt;/span&gt; end &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; fibonacci&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; it &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; end&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;it&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;endl&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// El tipo auto nos permite omitir el tipo de una variable&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// si es muy largo y deja su determinación a cargo del&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// compilador&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// La anterior sintaxis no es la más cómoda (de hecho,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// es una de las razones por las que puse el iterador&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// inicial y de fin en líneas aparte para mejorarlo&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// un poco), pero desde C++20 en adelante existe una&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// forma mucho más simple que podemos usar, gracias&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// a la nueva librería ranges&lt;/span&gt;

&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;ranges&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; fibonacci &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;views&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;reverse&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;endl&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// El operador tubería (|) le entrega la lista a&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// std::views::reverse, el cual invierte los iteradores&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// y permite recorrerlo en reversa con menos código&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;listas-simplemente-enlazadas&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#listas-simplemente-enlazadas&quot; aria-label=&quot;listas simplemente enlazadas permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Listas simplemente enlazadas&lt;/h4&gt;
&lt;p&gt;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 &lt;code class=&quot;language-text&quot;&gt;std::forward_list&lt;/code&gt;, que funciona de forma idéntica a &lt;code class=&quot;language-text&quot;&gt;std::list&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;forward_list&gt;&lt;/span&gt;&lt;/span&gt;

std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;forward_list&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; simple&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Iteración regular (de inicio a fin)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; simple&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;endl&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// ESTO NO VA A FUNCIONAR&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;auto&lt;/span&gt; it &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; simple&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rbegin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;auto&lt;/span&gt; end &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; simple&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; it &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; end&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;it&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;endl&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;conclusión&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusi%C3%B3n&quot; aria-label=&quot;conclusión permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusión&lt;/h3&gt;
&lt;p&gt;Esperando que les haya servido este artículo, en la próxima iteración veremos las dos principales formas de almacenar variables en memoria (&lt;em&gt;heap&lt;/em&gt; y &lt;em&gt;stack&lt;/em&gt;), 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!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[[ES] Sintáxis básica de C++ (parte 1)]]></title><description><![CDATA[Una introducción a la sintaxis de C++.]]></description><link>https://jorgejarai.github.io/posts/sintaxis-basica-cpp-parte-1</link><guid isPermaLink="false">https://jorgejarai.github.io/posts/sintaxis-basica-cpp-parte-1</guid><pubDate>Tue, 16 Mar 2021 19:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hola, con este artículo doy inicio a una serie de &lt;em&gt;posts&lt;/em&gt; explicando la sintaxis básica y expresiones usadas en las versiones modernas de C++ (C++11 en adelante). Hay mucho material dando vueltas por internet que explica lo mismo que quiero hacer, pero que suele estar enfocado en versiones anteriores de la norma y, hoy por hoy, están bastante desactualizados, considerando que en los últimos 10 años se han añadido bastantes características que han mejorado el uso del lenguaje considerablemente y lo han vuelto una herramienta aún más poderosa si se usa de forma apropiada.&lt;/p&gt;
&lt;p&gt;En este primer artículo explicaré lo básico sobre estructuras de control, variables, tipos de variables y bibliotecas y la estructura de un programa sencillo. No explicaré todo desde cero porque asumo que quien lea esto entenderá lo básico sobre programación. No es necesariamente cosas que fueron añadidas en versiones recientes del lenguaje, pero esto nos permitirá sentar una base para lo que venga a futuro.&lt;/p&gt;
&lt;h2 id=&quot;variables&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#variables&quot; aria-label=&quot;variables permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Variables&lt;/h2&gt;
&lt;p&gt;Una variable se podría definir como un contenedor o recipiente que alberga algún tipo de dato en memoria, como puede ser un entero, una cadena de caracteres, un arreglo de números decimales, entre muchos otros.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Una variable se define de la forma&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;lt;tipo&gt; &amp;lt;nombre&gt; [= &amp;lt;valor inicial&gt;];&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Un número entero entre -2^31 y (2^31)-1&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// en arquitecturas de PC modernas&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; nice &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;69&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Un número sin signo entre 0 y (2^32)-1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; poblacion &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18730000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Un número entre -128 y 127 (usualmente&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// utilizado para caracteres ASCII básicos)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; a_mayus &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;A&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Un número flotante de precisión simple (~7 decimales)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; un_medio &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Flotante de precisión doble (~15 decimales)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;double&lt;/span&gt; pi &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3.141592653589793&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Un valor booleano (verdadero/falso)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;bool&lt;/span&gt; es_verdad &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Una cadena de caracteres terminada en 0 y&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// de tamaño fijo (el 0 es implícito; lo&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// añade el ompilador)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; saludo&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hola&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Una versión mejorada del ejemplo anterior&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// (permite un manejo de texto más simple y es&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// de tamaño variable)&lt;/span&gt;
std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string despedida &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hola&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Si no se asigna un valor al definir la variable, su&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// contenido quedará indeterminado (podría tomar&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// cualquier valor presente en memoria al momento de&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ejecutarse el programa)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Sin embargo, esto no es necesariamente malo. Solo hay que&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// tener cuidado y asignarle un valor antes de usarla&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; indet&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

indet &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;420&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Aquí le asignamos un valor. Nice&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Una variable puede definirse como constante (&lt;code class=&quot;language-text&quot;&gt;const&lt;/code&gt;) si no se piensa modificar una vez creada:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;double&lt;/span&gt; phi &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1.618&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

phi &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// INVÁLIDO&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;sintaxis-básica-de-un-programa&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#sintaxis-b%C3%A1sica-de-un-programa&quot; aria-label=&quot;sintaxis básica de un programa permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sintaxis básica de un programa&lt;/h2&gt;
&lt;p&gt;Para crear un programa en C++, necesitamos crear un archivo fuente que contenga el código que queremos ejecutar. Para esto existen un sinnúmero de editores o entornos de desarrollo que pueden usar (Visual Studio, Visual Studio Code, Emacs, Vim, Atom, Sublime Text, etc.). Lo importante aquí es tener acceso a un compilador que convierta el código fuente en código máquina que el computador pueda entender. En este ejemplo voy a usar &lt;code class=&quot;language-text&quot;&gt;g++&lt;/code&gt;, parte de la &lt;em&gt;suite&lt;/em&gt; GCC y que se encuentra disponible en toda distribución GNU/Linux (e inclusive en Windows, gracias a proyectos como MinGW, por dar un ejemplo).&lt;/p&gt;
&lt;p&gt;La estructura de un programa C++ básico es como la siguiente:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Bibliotecas a incluir&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;iostream&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;vector&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;saludar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hola\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Esta no es la forma óptima de recibir un argumento,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// pero veremos cómo mejorarlo más adelante.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;suma&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;vector&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; vec&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;vec&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; acc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; vec&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        acc &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; acc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;saludar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;vector&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; nums&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;suma&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nums&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Los tres bloques entre llaves que ven se denominan &lt;em&gt;funciones&lt;/em&gt;. Estas son trozos de código que encapsulan alguna funcionalidad y permiten separar instrucciones que cumplan propósitos diferentes. La última de estas es la más importante, pues el compilador espera que en el código que le proveamos exista como mínimo una función llamada &lt;code class=&quot;language-text&quot;&gt;main&lt;/code&gt;. Esta cumple el rol de ser el punto de entrada desde el cual el sistema operativo empezará a ejecutar código.&lt;/p&gt;
&lt;p&gt;Una función puede recibir valores como entrada (sobre los que puede trabajar) y entregar como salida otro valor. Tanto entradas como salidas son opcionales e implementarlas o no dependerá de las circunstancias en las que estén trabajando.&lt;/p&gt;
&lt;p&gt;En el caso de la importante función &lt;code class=&quot;language-text&quot;&gt;main&lt;/code&gt; o la función &lt;code class=&quot;language-text&quot;&gt;saludar&lt;/code&gt;, podemos notar que no aceptan argumentos, esto porque los paréntesis que vemos después del nombre están vacíos (&lt;code class=&quot;language-text&quot;&gt;()&lt;/code&gt;). En cambio, la función &lt;code class=&quot;language-text&quot;&gt;suma&lt;/code&gt; acepta un vector de enteros de nombre &lt;code class=&quot;language-text&quot;&gt;vec&lt;/code&gt; (&lt;code class=&quot;language-text&quot;&gt;std::vector&amp;lt;int&gt; vec&lt;/code&gt;). Con respecto a las salidas, tanto la función &lt;code class=&quot;language-text&quot;&gt;main&lt;/code&gt; como &lt;code class=&quot;language-text&quot;&gt;suma&lt;/code&gt; devuelven un entero. En el caso de &lt;code class=&quot;language-text&quot;&gt;suma&lt;/code&gt;, la suma de los números del vector que le entregamos. En el caso de &lt;code class=&quot;language-text&quot;&gt;main&lt;/code&gt;, este número lo recibe el SO e indica si la ejecución fue exitosa (retorna 0) o no (cualquier número distinto de 0).&lt;/p&gt;
&lt;p&gt;Ahora, para convertir este código en un ejecutable, lo guardamos en un archivo (en este caso lo podemos llamar &lt;code class=&quot;language-text&quot;&gt;funciones.cpp&lt;/code&gt;) y ejecutaremos el siguiente comando en una terminal:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;g++ -o funciones funciones.cpp&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Lo que hacemos aquí es invocar al compilador &lt;code class=&quot;language-text&quot;&gt;g++&lt;/code&gt; para que lea el archivo &lt;code class=&quot;language-text&quot;&gt;funciones.cpp&lt;/code&gt;, lo procese y lo convierta en el ejecutable &lt;code class=&quot;language-text&quot;&gt;funciones&lt;/code&gt; (&lt;code class=&quot;language-text&quot;&gt;funciones.exe&lt;/code&gt; si se compila en Windows; el &lt;code class=&quot;language-text&quot;&gt;.exe&lt;/code&gt; se debería añadir implícitamente).&lt;/p&gt;
&lt;p&gt;Este proceso es relativamente simple si solo queremos compilar un programa a partir de uno o dos archivos fuente. El problema viene cuando nuestro programa depende de varios archivos y no queremos llamar a &lt;code class=&quot;language-text&quot;&gt;g++&lt;/code&gt; decenas de veces o escribir un comando que tome tres líneas de la pantalla. Para problemas como este existen soluciones como &lt;code class=&quot;language-text&quot;&gt;make&lt;/code&gt; o CMake, las que podemos ver más adelante. Para proyectos simples, basta con una llamada a &lt;code class=&quot;language-text&quot;&gt;g++&lt;/code&gt; siguiendo la siguiente sintaxis:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;g++ &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;-o &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;nombre_ejecutable&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;archivo_&lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;1&lt;/span&gt;&gt;&lt;/span&gt;.cpp &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;archivo_&lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;.cpp &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;. &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;archivo_n&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;.cpp&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si no especifican un nombre para el ejecutable con &lt;code class=&quot;language-text&quot;&gt;-o&lt;/code&gt;, el compilador lo llamará &lt;code class=&quot;language-text&quot;&gt;a.out&lt;/code&gt; (nota histórica: este nombre se remonta a cuando Linux aún no existía y x86 no era la arquitectura principal para sistemas UNIX).&lt;/p&gt;
&lt;h2 id=&quot;bibliotecas&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#bibliotecas&quot; aria-label=&quot;bibliotecas permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bibliotecas&lt;/h2&gt;
&lt;p&gt;Además de las características propias del lenguaje (algunas de las cuales veremos después de esta sección), la librería estándar ofrece varias bibliotecas (que no son más que código ya escrito que implementa funcionalidades usadas a menudo por programadores) que nos permiten, por ejemplo, trabajar con entrada y salida de la terminal, lectura y escritura de archivos, el uso de contenedores para almacenar datos (como los vectores que ya he mencionado) y algoritmos de manipulación de datos, ordenamiento, entre muchos otros.&lt;/p&gt;
&lt;p&gt;La biblioteca más importante para comenzar en mi opinión es &lt;code class=&quot;language-text&quot;&gt;&amp;lt;iostream&gt;&lt;/code&gt;, que nos permite imprimir texto en pantalla y leerlo desde el teclado del usuario, esto por medio de los &lt;em&gt;streams&lt;/em&gt; &lt;code class=&quot;language-text&quot;&gt;std::cin&lt;/code&gt; (la entrada estándar, usualmente el teclado), &lt;code class=&quot;language-text&quot;&gt;std::cout&lt;/code&gt; (la salida estándar, por lo general la pantalla) y &lt;code class=&quot;language-text&quot;&gt;std::cerr&lt;/code&gt; (el error estándar, que igual suele ser la pantalla, pero para mantener los errores separados de la salida normal). Se les denomina &lt;em&gt;stream&lt;/em&gt; porque internamente podemos imaginar estos tres conductos como corrientes (&lt;em&gt;streams&lt;/em&gt;) por las que fluye la información de manera constante, donde terminan llegando a un búfer que los va acumulando y permiten que el programa pueda captar datos que no necesariamente llegan a una tasa constante.&lt;/p&gt;
&lt;p&gt;Más adelante veremos estructuras y objetos como &lt;code class=&quot;language-text&quot;&gt;std::vector&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;std::list&lt;/code&gt; o &lt;code class=&quot;language-text&quot;&gt;std::fstream&lt;/code&gt;, que nos otorgan más posiblidades para resolver problemas con nuestro código.&lt;/p&gt;
&lt;h3 id=&quot;iostream-entrada-y-salida-de-terminal&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#iostream-entrada-y-salida-de-terminal&quot; aria-label=&quot;iostream entrada y salida de terminal permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;iostream&gt;&lt;/code&gt;: Entrada y salida de terminal&lt;/h3&gt;
&lt;p&gt;Si desean imprimir texto en pantalla, pueden hacer uso de &lt;code class=&quot;language-text&quot;&gt;std::cout&lt;/code&gt;, el cual recibirá cualquier texto, número o variable que le entreguen y lo imprimirá en la salida estándar o &lt;code class=&quot;language-text&quot;&gt;stdout&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;iostream&gt;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Así se incluye una biblioteca.&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// El operador &amp;lt;&amp;lt; indica que queremos &quot;insertar&quot;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// el texto &quot;Hola\n&quot; en el stream de salida&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hola\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si necesitan retornar un error, es buena práctica mantenerlo separado de &lt;code class=&quot;language-text&quot;&gt;stdout&lt;/code&gt; y dirigirlo en cambio a &lt;code class=&quot;language-text&quot;&gt;stderr&lt;/code&gt; (el error estándar) usando &lt;code class=&quot;language-text&quot;&gt;std::cerr&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;iostream&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hacer_algo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Este es un prototipo. Indica que existe&lt;/span&gt;
                  &lt;span class=&quot;token comment&quot;&gt;// una función pero cuyo código aún no está&lt;/span&gt;
                  &lt;span class=&quot;token comment&quot;&gt;// definido (en este caso podría estar al&lt;/span&gt;
                  &lt;span class=&quot;token comment&quot;&gt;// fondo del archivo)&lt;/span&gt;

                  &lt;span class=&quot;token comment&quot;&gt;// Tanto C como C++ esperan que una función&lt;/span&gt;
                  &lt;span class=&quot;token comment&quot;&gt;// esté definida antes de llamarla. Una&lt;/span&gt;
                  &lt;span class=&quot;token comment&quot;&gt;// forma de sortear esto es poniendo el&lt;/span&gt;
                  &lt;span class=&quot;token comment&quot;&gt;// prototipo al inicio y definir la&lt;/span&gt;
                  &lt;span class=&quot;token comment&quot;&gt;// función después&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hacer_algo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// Si la función retorna 0, imprimimos a stdout&lt;/span&gt;
        std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Éxito\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// De no ser así, indicamos el error en stderr&lt;/span&gt;
        std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cerr &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Chale\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Aquí definimos la función ya declarada anteriormente&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hacer_algo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como pueden ver, para imprimir en una nueva línea, podemos escapar el carácter ASCII para nueva línea (también conocido como LF) usando el ya tradicional &lt;code class=&quot;language-text&quot;&gt;\n&lt;/code&gt;. Sin embargo, otra forma de hacer esto es insertando en el &lt;em&gt;stream&lt;/em&gt; de salida (ya sea &lt;code class=&quot;language-text&quot;&gt;std::cerr&lt;/code&gt; o &lt;code class=&quot;language-text&quot;&gt;std::cout&lt;/code&gt;) el manipulador &lt;code class=&quot;language-text&quot;&gt;std::endl&lt;/code&gt;, que además de insertar el carácter &lt;code class=&quot;language-text&quot;&gt;\n&lt;/code&gt; fuerza la descarga el búfer de salida en pantalla (el texto que uno pone en &lt;code class=&quot;language-text&quot;&gt;stdout&lt;/code&gt; o &lt;code class=&quot;language-text&quot;&gt;stderr&lt;/code&gt; puede no ser impreso inmediatamente, pues depende de la implentación del sistema).&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Estas dos líneas&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;endl&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;van a estar en líneas separadas.\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finalmente, si queremos leer información de parte del usuario (como un número o un texto), usaremos &lt;code class=&quot;language-text&quot;&gt;std::cin&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;iostream&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;string&gt;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Para trabajar con el tipo std::string&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Cuál es tu nombre?\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;string nombre&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// En este caso, el operador &gt;&gt; indica&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// que queremos extraer un string desde&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// stdin (la entrada estándar) y guar-&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// darlo en una variable&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cin &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; nombre&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hola, &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; nombre &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;!\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;También es posible utilizar las funciones propias de la librería estándar de C (como &lt;code class=&quot;language-text&quot;&gt;printf&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;scanf&lt;/code&gt; y sus derviados). En este caso, en vez de incluir la biblioteca &lt;code class=&quot;language-text&quot;&gt;&amp;lt;stdio.h&gt;&lt;/code&gt; usaremos &lt;code class=&quot;language-text&quot;&gt;&amp;lt;cstdio&gt;&lt;/code&gt;, pues así se denomina el archivo de cabecera según la norma de C++. Técnicamente es posible usar &lt;code class=&quot;language-text&quot;&gt;&amp;lt;stdio.h&gt;&lt;/code&gt; en archivos C++, pero esto no está contemplado en la norma y no es una característica garantizada en todos los compiladores. Todas las bibliotcas que vienen de la libería estándar de C existen en C++ usando la misma nomenclatura (eliminando el &lt;code class=&quot;language-text&quot;&gt;.h&lt;/code&gt; al final y anteponiendo una &lt;code class=&quot;language-text&quot;&gt;c&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&quot;estructuras-de-control&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#estructuras-de-control&quot; aria-label=&quot;estructuras de control permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Estructuras de control&lt;/h2&gt;
&lt;h3 id=&quot;condicionales-simples-if&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#condicionales-simples-if&quot; aria-label=&quot;condicionales simples if permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Condicionales simples (&lt;code class=&quot;language-text&quot;&gt;if&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Los bloques &lt;code class=&quot;language-text&quot;&gt;if&lt;/code&gt; son el tipo de estructura más simple. El programa verifica si una condición es verdadera o falsa y, dependiendo del resultado, ejecuta código:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// El programa ejecutará el código entre las llaves&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// si 2 + 2 es igual a 4&lt;/span&gt;

    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;El universo está funcionando bien.\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Es posible ejecutar otro bloque de código en caso de que la condición no sea cierta o inclusive comprobar más de una condición en caso de que la primera no sea verdadera:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Nada que ver por aquí.\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cerr &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Houston, tenemos un problema!\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; numero &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;numero &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Si el número es mayor a 0,&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// salta a la siguiente condición&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Negativo\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;numero &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Ídem&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Cero\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Si esta condición tampoco&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// es verdadera, el programa no hará nada&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Positivo\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;condicionales-de-selección-switch&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#condicionales-de-selecci%C3%B3n-switch&quot; aria-label=&quot;condicionales de selección switch permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Condicionales de selección (&lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Si tenemos que una variable pueda tener uno de varios valores, podemos comprobar cuál de estos es usando una secuencia de &lt;code class=&quot;language-text&quot;&gt;if&lt;/code&gt;-&lt;code class=&quot;language-text&quot;&gt;else if&lt;/code&gt; como en la sección anterior. Sin embargo, puede volver el código poco legible si se trata de operaciones sencillas. Para casos así, podemos usar la estructura &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; letra &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;letra&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;y&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Si la letra fuera &apos;y&apos;, ejecutaría este código y&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// saldría del switch&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Semivocal\n&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Si se omite la expresión break, el programa&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// irá revisando los otros casos hasta&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// encontrar otro break o salir del switch&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;e&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;i&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;o&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;u&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Vocal\n&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Este código se ejecuta sólo si ninguno de los&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// valores anteriores coincide&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Consonante\n&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;bucles&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#bucles&quot; aria-label=&quot;bucles permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bucles&lt;/h3&gt;
&lt;h4 id=&quot;while-y-do-while-controlado-por-condición&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#while-y-do-while-controlado-por-condici%C3%B3n&quot; aria-label=&quot;while y do while controlado por condición permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;while&lt;/code&gt; y &lt;code class=&quot;language-text&quot;&gt;do while&lt;/code&gt; (controlado por condición)&lt;/h4&gt;
&lt;p&gt;Los bucles &lt;code class=&quot;language-text&quot;&gt;while&lt;/code&gt; son los más simples en teoría. El código que envuelven es ejecutado si y sólo si la condición se mantiene verdadera. De serlo, se reejecuta. En caso contrario, se sale del bucle y se continúa con la ejecución del programa.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// El programa imprimirá &quot;Hola!&quot; en pantalla&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// mientras n tenga un valor positivo&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hola!\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    n&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Es posible, si así se desea, crear un bucle infinito, el cual ejecutará el código que envuelve infinitamente hasta que el programa se interrumpa o el equipo que lo ejecuta se apague:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;El santuario de santa Teresita&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; aún necesita tu aporte\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Lo importante a considerar es que el chequeo de la condición se realiza antes de ejecutar el código del bucle, cosa contraria a lo que hace el bucle &lt;code class=&quot;language-text&quot;&gt;do while&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;farts\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    n&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// En este caso la verificación se hace al final&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;for-controlado-por-conteo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#for-controlado-por-conteo&quot; aria-label=&quot;for controlado por conteo permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; (controlado por conteo)&lt;/h4&gt;
&lt;p&gt;Cuando queremos ejecutar código una cierta cantidad fija de veces, podemos hacer uso de los bucles &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt;, los cuales hacen uso de un contador que es chequeado en cada “vuelta” del ciclo e indica si debe seguirse ejecutando el bucle.&lt;/p&gt;
&lt;p&gt;El bucle &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; es ligeramente más complicado que &lt;code class=&quot;language-text&quot;&gt;while&lt;/code&gt;, pues involucra la inicialización del contador, la condición que mantendrá el bucle activo y una instrucción que se ejecuta al final de cada iteración.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Este bucle parte con el entero i igualado a 0.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Se ejecutará siempre y cuando i sea menor que 10.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Al final de cada vuelta, i será incrementado en 1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Este bucle va a imprimir el valor de i 10 veces.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si desean que la variable del contador sea inicializada antes, se puede omitir de la declaración:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;*=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;funcion_rara&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Lo mismo puede hacerse con la instrucción que se ejecuta al final de cada paso (el único elemento obligatorio es la condición del bucle):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;

    i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calcular_i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Una forma especial de &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; es una no se inicializa un contador, ni condición ni instrucción de término de iteración, volviendo al código envuelto en un bucle infinito:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;cout &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;a\n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;for-basado-en-rangos-controlado-por-colección&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#for-basado-en-rangos-controlado-por-colecci%C3%B3n&quot; aria-label=&quot;for basado en rangos controlado por colección permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; basado en rangos (controlado por colección)&lt;/h4&gt;
&lt;p&gt;Esta es una mis características favoritas del lenguaje y que fue implementada en C++11.&lt;/p&gt;
&lt;p&gt;Como veremos más adelante, la librería estándar de C++ nos ofrece una gran cantidad de estructuras que nos permiten almacenar información de diversas formas, siendo una de ellas &lt;code class=&quot;language-text&quot;&gt;std::vector&lt;/code&gt;, la cual nos permite crear un arreglo expandible:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Arreglo tradicional de tamaño fijo&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; arr&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Esto no va a funcionar aunque quisiéramos&lt;/span&gt;
arr&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;vector&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; vec&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Vector expandible&lt;/span&gt;

vec&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push_back&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Añadimos otro número al final del vector&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;¿Por qué menciono esto antes de explicar bien lo que es un vector? Porque algo que se hace muy a menudo con estructuras como esta es recorrer todos los elementos de esta y hacer alguna acción con ellos. La forma tradicional de hacer esto hasta 2011 era la siguiente:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;vector&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; vec&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

std&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;vector&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;iterator it&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;it &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; vec&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; it &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; vec&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;it&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;¿Engorroso, no es así? Fue por esto que en C++ se implementaron los &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; basados en rango, los cuales simplifican esta sintaxis y la convierten en esto:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;cpp&quot;&gt;&lt;pre class=&quot;language-cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; num &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; vec&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como pueden ver, esta sintaxis es mucho más legible y cumple el mismo propósito. Al menos cuando se trate de recorrer una colección de cabo a rabo, esta última de escribir el &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; les ahorrará dolores de cabeza al necesitar menos código para cumplir el mismo objetivo, lo que hace al programa más mantenible y claro.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Please Don't Abuse Voice Messages]]></title><description><![CDATA[Just a quick rant for having something published on the page.]]></description><link>https://jorgejarai.github.io/posts/please-dont-abuse-voice-messages</link><guid isPermaLink="false">https://jorgejarai.github.io/posts/please-dont-abuse-voice-messages</guid><pubDate>Tue, 26 May 2020 22:40:32 GMT</pubDate><content:encoded>&lt;p&gt;Just a quick rant for having something published on the page.&lt;/p&gt;
&lt;p&gt;I’m not an extremely sociable person by any means, but I do chat pretty often with friends or classmates via IM platforms like WhatsApp. Whether it is for complaining about a shitty teacher, sending memes or sharing news, having a platform to communicate with people is a total must nowadays.&lt;/p&gt;
&lt;p&gt;However, if there is something I cannot withstand is having to interrupt my Pretty Busy Workflow™ (mainly composed of YouTube binging, procrastinating and feeling anxiety at times) for having to listen to someone’s voice messages. It’s not a big deal for me if it is something occasional, but when it comes to people whose main way to send information to others is by voice messages I cannot but scream internally when I have to listen to three minute-long messages that I can’t listen at a 2x speed rate (if the folks at WhatsApp really cared about UX, they should have implemented features like this a long time ago; probably this wouldn’t be such a “problem” for me if that were the case).&lt;/p&gt;
&lt;p&gt;I’m a person with a relatively low attention span, and that’s the reason I like things done fast. If you’re going to spend 15 minutes in saying something that could have been said in less than 3, you lost me. I know that voice is a lot more expressive than sending a string of text with one or two emojis, but please: use them wisely. At least try to plan what you’re going to record and be concise. People like me will thank you.&lt;/p&gt;</content:encoded></item></channel></rss>