Sei sulla pagina 1di 50

Arreglos inteligentes con C++: <vector>

Marcia Martnez

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

QUE ES UN ARREGLO ?
Es una forma de almacenar informacin en RAM, como una coleccin ordenada en secuencia de elementos de datos de un mismo tipo bajo un mismo nombre.

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

DIRECCION EN RAM ARREGLO Ai DE ENTEROS VALOR ALMACENADO

FFF01 A1 12

FFF02 A2 1234

FFF03 A3 -7893

... ... ...

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

Si hacemos: A1 = A1 + A2; A2 = -456, Entonces, los nuevos valores almacenados en cada Ai son:

DIRECCION EN RAM

FFF01

FFF02

FFF03

...

ARREGLO Ai DE ENTEROS VALOR ALMACENADO

A1 1246

A2 -456

A3 -7893

... ...

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

Cada elemento es identificado con una variable subindicada; Las variables subindicadas se comportan como las variables simples, esto es, podemos hacer las mismas operaciones (asignacin, ...); Cada elemento almacena el mismo tipo de dato;

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

Cada elemento, en diferentes momentos, puede ir almacenando diferentes valores, del mismo tipo; El arreglo entero es almacenado en bloques contiguos de RAM. Esto es, no hay huecos entre un elemento y el siguiente;

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

Cada elemento es identificado por un subndice nico, esto es, un elemento se distingue de otro por medio del subndice; En un arreglo dado puede haber elementos con valores almacenados iguales pero nunca con el mismo subndice; Los subndice se numeran desde 0, esto es, 0, 1, 2, 3 ...
Marcia Martnez ARREGLOS INTELIGENTES EN C++ 7

EJEMPLOS DE ARREGLOS

Un arreglo de butacas: Bo, B1, B2, B3, ..., Bi Cada Bi solo almacena un estudiante, aunque puede almacenar, en diferentes momentos, diferentes estudiantes;

...

B0

B1

B2

B3

...

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

EJEMPLOS DE ARREGLOS
Una imagen puede ser representada como un gran arreglo de lecturas de brillo, un elemento para cada una de las miles de celdas en que la imagen es dividida;

Un arreglo de pixeles;

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

TIPOS DE ARREGLOS EN C++


De tamao fijo en tiempo de compilacin:
T ID[n]; n es el nmero de elementos en el arreglo;

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

10

De tamao fijo en tiempo de ejecucin, usando punteros y los operadores de C++ new y delete:
T *pID = new T[n]; // n entero ... delete *pID; En el tema de punteros veremos esto;
Marcia Martnez ARREGLOS INTELIGENTES EN C++ 11

De tamao variable en tiempo de ejecucin: Son los arreglos inteligentes o <vector>, que desarrollaremos en este curso;

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

12

<array>

<valarray>

LOS CUALES ESTN FUERA DEL ALCANCE DE ESTE CURSO.

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

13

ARREGLOS DE TAMAO FIJO EN TIEMPO DE COMPILACIN


T ID[n];

Declara ID un arreglo vaco de n elementos tipo T


T ID[n] = { v1, v2, v3, ..., vn} ;

Declara ID un arreglo de n elementos y cada elemento es inicializado con un valor vi de tipo T

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

14

#include <iostream> using namespace std;


int main(void){

system("cls"); double a[10000];// Declara un array de size fijo de 10000 doubles int indice(0); // cout << "\n\n => Entre numeros reales, CTRL+Z termina\n" << endl; while (cin >> a[indice]){ indice++; } double suma(0); for (int i(0); i < indice; i++) { suma = suma + a[i]; // Acumula los valores a[i] } cout << "La suma de los reales suplidos es: " << suma << endl; return 0;
}
Marcia Martnez ARREGLOS INTELIGENTES EN C++ 15

C:\Borland\BCC55\Bin>array0 => Entre numeros reales, CTRL+Z termina 1.23 2.34 3.45 4.56 0.0000456 ^Z ^Z La suma de los reales suplidos es: 11.58

Ver array0.cpp

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

16

ARREGLOS DE CADENAS DE CARACTERES


char cadena[80]; define una cadena como un arreglo de caracteres; Es una cadena al estilo C; Para manipular este tipo de cadena se requiere de la librera <cstring>; Permite trabajar con una cadena de tamao fijo desde el momento de su declaracin.
Marcia Martnez ARREGLOS INTELIGENTES EN C++ 17

#include <iostream> #include <cstring> using namespace std; int main(void){

// cstr0.cpp

char cad1[]="Esto es una cadena al estilo C"; char cad2[40]; char cad3[40];
// USO DE LA FUNCION strcpy( c2, c1) strcpy(cad2, cad1); strcpy(cad3, "Copiando a cad3"); cout << endl << cad1 << endl << endl << cad2 << endl << endl << cad3 << endl; return 0;

}
Marcia Martnez ARREGLOS INTELIGENTES EN C++ 18

/* C:\Borland\BCC55\Bin>cstr0 Esto es una cadena al estilo C Esto es una cadena al estilo C Copiando a cad3 */

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

19

<vector>

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

20

QUE ES UN <vector> C++ ?


Es el arreglo oficial de C++; Esta implementado en la librera <vector>; Es un arreglo que puede crecer dinmicamente, esto es, su tamao es variable en tiempo de ejecucin; Si T es un tipo, entonces, vector<T> v1 define v1 como un arreglo dinmico de elementos de tipo T;

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

21

Es un arreglo inteligente, a diferencia de los arreglos regulares, el almacenamiento es manejado de manera automtica, permitiendo ser expandido o contrado a requerimiento en tiempo de ejecucin;

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

22

Son ms eficientes y seguros accesando a sus elementos por el subndice; Permiten acceso aleatorio de sus elementos en cualquier orden;

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

23

Permiten su redimensionamiento con facilidad;

Permiten aadir y remover elementos despus del y en el ltimo;

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

24

pop_back()

EN UN <vector> C++:
POSICION INDICE VALOR

push_back(x)

1 0 V0

2 1 V1

3 2 V2

4 3 V3

5 4 V4

... .. ...

n n-1 Vn-1 back()

n+1

front() begin()

end()

at(3)

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

25

DECLARACION (DEFINICION) DE UN <vector> EN C++


Requiere #include <vector>
vector<T> id; // Declara un <vector> de tipo T, vacio

vector<T> id(Ke); /* Declara un <vector> de tipo T, con una cantidad inicial de Ke elementos */
vector<T> id(Ke, KVi); /* Declara un <vector> de tipo T con Ke elementos y KVi valores iniciales */

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

26

EJEMPLOS (segmento de cdigo) vector<float> tasa;


vector<int> est41101(25); vector<string> nombres(12, Freddy Prez);

ver

vect0.cpp

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

27

RECURSOS EN <vector> de C++


vectorID.recurso
assign at back end erase front operator= operator[ ] pop_back reserve resize size

begin capacity clear empty


Marcia Martnez

get_allocator insert max_size

push_back rbegin rend

swap

ARREGLOS INTELIGENTES EN C++

28

capacity(), max_size(), size() capacity() Es la capacidad de almacenamiento actualmente asignada, expresada como cantidad de elementos; max_size() Mximo nmero de elementos que el <vector> puede almacenar;
size() Cantidad de elementos en el <vector> VER vect11.cpp
Marcia Martnez ARREGLOS INTELIGENTES EN C++ 29

OPERACION DE ASIGNACION EN <vector> vect2 = vect1;

erase() todos los elementos en vect2; insert() en vect2 una copia de cada uno de los elementos en vect1;
Despus de la asignacin vect2 y vect1 tienen el mismo size y comparan a igual uno con otro;

VER vect10.cpp
Marcia Martnez ARREGLOS INTELIGENTES EN C++ 30

AGREGANDO Y RETIRANDO ELEMENTOS A UN <VECTOR>;

push_back Agrega un nuevo elemento al <vector> justamente despus del ltimo; pop_back Remueve el ltimo elemento del <vector> reducindolo en 1 y borrando toda referencia a dicho elemento retirado;

Ejemplo:
VER vect12.cpp; vect0.cpp;
ARREGLOS INTELIGENTES EN C++

vect1.cpp;
31

Marcia Martnez

ACCESANDO A LOS ELEMENTOS DE UN <vector>

Usando el recurso at(indice);


Usando un iterator; Usando el operador de subndice [indice]; NO ES RECOMENDADO, a(t) ES MAS SEGURO;

Todos permiten acceder al elemento en el <vector> y hacer operaciones como lo hacemos con cualquier variable simple.
EJEMPLO: vect1.cpp; vect2.cpp
Marcia Martnez ARREGLOS INTELIGENTES EN C++ 32

EL RECURSO

vector<T>::iterator

vector<T>::iterator id; Declara un apuntador llamado id que permite accesar a los elementos en el <vector> en forma anloga al uso del indice pero ms segura. Identifica el <vector> y un elemento en este;

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

33

Nos permite examinar, con *id, el valor almacenado en ese elemento; Nos provee operaciones, *(id + entero), para movernos entre los elementos del <vector>;
Restringe las operaciones a las que <vector> puede manejar con eficiencia;

VER vect2.cpp

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

34

RECURSOS begin() y end()

begin() retorna un apuntador al primer elemento del <vector>, esto es, vector.at(0); o vector.front(); end() retorna un apuntador a la posicin uno ms despus del ltimo elemento; En el <vector> actual at(n) no existir

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

35

GRFICAMENTE:
begin() end()

E0

E1

E2

E3

E4

E5

Ei

En-1 En

EL <vector> ACTUAL SIEMPRE VA DESDE i = 0 HASTA i = n-1


VER vect2.cpp

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

36

EJEMPLOS (segmento de cdigo) vector<double>::iterator iter1, iter2; Declara iter1, iter2 como iteradores de vectores de double; vector<double> v1; iter1= v1.begin(); Pone el iter1 a apuntar el primer elemento del <vector> de dobles v1; *iter1 Accesa al valor almcenado en la posicin a la que actualmente apunte;

VER vect2.cpp
Marcia Martnez ARREGLOS INTELIGENTES EN C++ 37

OPERADORES DE IGUALDAD
== Y != OPERADORES DE RELACION CON <vector> <, >, <= y >=

VER ARCHIVO vector_comparacion.doc

VER vect9.cpp

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

38

MAS RECURSOS EN <vector>


insert(), erase(), assign(), empty(), swap(), ... clear(),

VER EL ARCHIVO vector_recursos.doc

VER vect3.cpp; vect4.cpp; vect6.cpp; vect7.cpp; vect8.cpp;

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

39

clear()
El recurso clear() de <vector> remueve todos los elementos en un <vector> dado, dejndolo con un size de 0 y liberando la memoria asignada.

vector<T> v; ... v.clear();


Marcia Martnez ARREGLOS INTELIGENTES EN C++ 40

POR EJEMPLO:
=> La capacidad del <vector> actual es: 0 => La capacidad del <vector> actual es: 64

=> El contenido actual en el <vector> es:


Estamos en <vector>, ! que bien ! Y tenemos 6 puntos Para el next lab => Estoy vacio, mi size es: 0 elementos => La capacidad del <vector> actual es: 64 => La capacidad del <vector> actual es: 64 => Me han empujado elementos y ahora tengo 2, los cuales son:

Ahora le cargo un elemento Otro elemento

Ver el cdigo completo en vectclear0a.cpp


41

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

Segn el comit estndar de C++, clear() no cambia la capacidad del <vector>, nicamente cambia su size;

En el ejemplo vectclear0a.cpp se ilustra lo indicado anteriormente.

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

42

erase()
El recurso erase () de <vector> remueve del vector un elemento de una posicin indicada o un rango de elementos [primero, ltimo].
vector<T>v; v.erase(pos); v.erase(pos1, pos2);
Marcia Martnez ARREGLOS INTELIGENTES EN C++ 43

v.erase(pos); Remueve el elemento en la posicin pos; v.erase(pos1, pos2 ); Remueve los elementos en el rango [pos1, pos2];

pos, pos1 y pos2 deben ser iteradores del <vector>

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

44

POR EJEMPLO
=> El contenido del <vector> v es: 1.23 12.33 13.44 14.55 15.66 16.77 17.88 Si hacemos un v.erase (v.begin() + 5);

=> El contenido ahora es: 1.23 12.33 13.44 14.55 15.66 17.88
Si hacemos v.erase(v.begin() + 2, v.begin() + 4); => El contenido ahora es: 1.23 12.33 15.66 17.88 Ver cdigo completo en vecterase1.cpp
Marcia Martnez ARREGLOS INTELIGENTES EN C++ 45

<valarray>
C++ provides the standard library <valarray>, which is designed to carry out vector operations very efficiently.
By now this topic is out of scope of this course. I am so sorry.

Ferreiras

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

46

<array>
<array> Es la nueva herramienta de C++, en su versin C++09, como una alternativa eficaz a <vector> para la manipulacin de arreglos de tamao fijo. Obviamente, solo con aquellos compiladores que sean C++09 es que podremos usarla, bcc32 5.5 no lo es. ;-)

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

47

Por ejemplo, en un compilador C++09, las siguientes instrucciones usan <array> array<float,3> A = {{1., 2., 3.}}; array<float,3> B; array<float,3> C = {{10., 20., 30.}};

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

48

<vector> MULTIDIMENSIONALES
VER EJEMPLOS:
vect2D1b.cpp

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

49

GRACIAS.

Marcia Martnez

ARREGLOS INTELIGENTES EN C++

50

Potrebbero piacerti anche