Anuncios Google

Vectores (Parte 1)

Tutoriales de Programaciones

Todavía leo por aquí mucha gente que se cree que C++ es un C con 4 extensiones. C++ es mucho más que eso, su forma de tratar los datos va más allá de C y muchas veces ni se le parece.

Nivel: Iniciado.
Requisitos:
Conocer algo de C ó C++ y
saber qué es un vector o array unidimensional.

Aquí voy a mostrar como tratar un vector o matriz de una dimensión "a lo C++", es decir, usando la librería estándar que este lenguaje incorpora.

Hay que intentar comprender que un vector se trata como un objeto o clase, nada que ver con el vector de C.

Ejemplo de declaración.

#include <vector>
using namespace std;
 
vector<int> foo;

Si os fijáis, la sintaxis es muy simple, se indica el tag vector y entre los símbolos "<>" el tipo de datos que contendrá, en este caso enteros.

Vamos a suponer que queremos crear un vector de 8 elementos.

#include <vector>
using namespace std;
 
vector<int> foo(8);

Con esta instrucción, asignamos 8 elementos al vector, también nos puede interesar a la misma vez que creamos los elementos ponerles un valor por defecto, vamos a inicializarlos a cero (recordad que tanto C como C++ no inicializan las variables al crearlas), el código sería:

#include <vector>
using namespace std;
 
vector<int> foo(8, 0);

También se puede crear un vector que sea la copia de otro vector

#include <vector>
using namespace std;
 
vector<int> foo(8);
vector<int> copia_de_foo(foo);

Este código de aquí puede parecer raro porque en el primero ponemos como parámetro un entero y en el segundo ponemos otro vector. En C, no se puede cambiar el tipo de dato que se envía a una misma función, en C++ sí. A esto se le llama "sobrecarga de funciones o métodos" y permite crear funciones con el mismo nombre y distintos parámetros, en este caso se trata no de una función, sino de un constructor: El constructor de la clase vector (recordad que vector es una clase, no una variable).

Es posible que no sepamos el número de elementos en un principio y queramos ir añadiéndolos poco a poco según nuestra aplicación, para ello usamos la instrucción push_back, que añade un elemento al final del vector. También se puede eliminar el último elemento con pop_back().

#include <vector>
using namespace std;
 
int main() {
   vector<int> foo;
   for (int i = 0; i < 8; i++)
      foo.push_back(99);
}

Hemos creado un vector de 8 elementos con el valor 99. Un detalle que muestra la diferencia con C, es el bucle for en el que hemos creado la variable "i". Sólo tiene valor en el bucle, una vez salimos de él, desaparece. Esto es útil porque nos evita tener que inicializar al principio variables de bucle, que como se compartirán en distintos bucles, pueden dar lugar a confusión o error. Si ejecutáis este código, dará error, porque "i" ya no existe porque no estamos en el bucle

#include <vector>
#include <iostream>
using namespace std;
 
int main() {
   vector<int> foo;
   for (int i = 0; i < 8; i++)
      foo.push_back(99);
   cout << "El valor de i es: " << i;
}

Una puntualización sobre los vectores y que hay que tener en cuenta al desarrollar tanto en C como en C++ es la optimización de memoria. Si quisieramos añadir/eliminar 20000 elementos en nuestra aplicación, pero esto se hará a lo largo de la misma y en diferentes momentos, al final generaríamos las famosas "memory leaks" o lagunas de memoria, que harán que los datos de dicho vector no estén consecutivos y al eliminarlos, quedarán huecos difíciles de usar. Una forma de prevenir esto, es reservar un valor de elementos antes de hacer nada con el vector.

#include <vector>
using namespace std;
 
vector<int> foo;
foo.reserve(20000);

Vuelvo a repetir, que esto reserva espacio "consecutivo" en memoria, no añade valores al vector, es posible que tengamos una aplicación en la que a veces usemos 8 elementos y otras veces 20000. En este ejemplo, tendríamos reservados de forma consecutiva en memoria un espacio para trabajar con 20000 elementos sin que ocurran memory leaks.

Se puede cambiar el tamaño del vector de forma dinámica durante la ejecución del aplicación, si se cambia a menos, los últimos elementos sobrantes se eliminarán. Se puede usar opcionalmente un inicializador de valores. Un ejemplo redimensionando 2 vectores con y sin valores iniciales.

#include <vector>
using namespace std;
 
vector<int> foo(8);
vector<int> foo_a_cero(8, 0);
 
foo.resize(25);
foo_a_cero.resize(25, 0);

En la próxima entrega, veremos cómo trabajar con ellos buscando un valor, ordenándolos y recorriéndolos para hacer algo con cada elemento sin teclear apenas código. También con un pequeño "truco" se pueden manejar matrices multidimensionales.

4.454545
Tu voto: Ninguno Votos totales: 4.5 (44 votos)

Anuncios Google

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Magnífico tuto, cada vez me

Magnífico tuto, cada vez me gusta más C++.

Imagen de P22

está bien que se hagan

está bien que se hagan tutoriales de este tipo, pues la gente no conoce apenas las diferencias existentes entre c y cpp

Imagen de pspgorrister

Gracias

Pero la verdad, es que con un sólo comentario, se le quitan a uno las ganas. Ojo, no es que pida comentarios de elogio, pero parece que nadie tiene dudas ni se interesa.

Deprime un poco... ;-)


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de burnxez

Nada de eso

No hay por que deprimirse, por ejemplo en mi caso, las dudas que tenía las expuse en el otro hilo es por eso que aquí no hay nada. Como dice Churristian8, si nadie comenta es porque ha quedado lo bastante claro, y sabes que tú tienes esa facilidad para lograrlo, así que no te asombres de ello.

Tus tutoriales siempre han sido bienvenidos en SceneBeta y sobra decir que, en mi caso, han resultado realmente útiles.

Arriba ese animo ;-)

Saludos.

Imagen de Churristian8

Todo lo contrario

Sabes de sobra que tus tutoriales son muy importantes tanto para la comunidad como para los usuarios.

Yo cuando en mis tutoriales no comenta nadie, me lo tomo como que ha quedado lo suficientemente claro y no hay preguntas que hacer porque estan todas resueltas en el tuto ;-)

Un saludo y no te deprimas, que aunque ayudes a solo un usuario (que dudo que sea solo uno), ya habrá merecido la pena :)

Imagen de pspgorrister

Yo cuando en mis tutoriales

Yo cuando en mis tutoriales no comenta nadie, me lo tomo como que ha
quedado lo suficientemente claro y no hay preguntas que hacer porque
estan todas resueltas en el tuto ;-)

Jaja, a eso le llamo yo ver el vaso siempre medio lleno.

Un saludo y gracias por lo ánimos.


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de NITEMAN

Que remedio

¿Tu crees que si no fuesemos optimistas habríamos llegado hasta aquí?

Cantra viento marea y todo pronostico... piensa que los tutoriales de programación de PSP tardaron años en dar frutos (entendamos coders), pero si el tuto es bueno se usará.

Salu2


"El paraí­so a mi derecha, el infierno a mi izquierda y el ángel de la muerte tras de mi."

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.