Guia Sobre Las STL Cpp

download Guia Sobre Las STL Cpp

of 32

Transcript of Guia Sobre Las STL Cpp

Gu de programacin C++ STL a oOmer Gimnez e 10 de junio de 2009

Introduccin oLa STL (Standard Template Library) es una librer estndard de estructuras de datos y algoritmos a a que forma parte del estndard del C++. Esto garantiza que cualquier compilador de C++ debe incluir a de serie esta librer por lo que cualquier programador puede usarla para sus programas. a, El objetivo fundamental de la STL es evitar que los programadores tengan que programarse, una y otra vez, aquellos algoritmos o estructuras de datos fundamentales, como por ejemplo el algoritmo de ordenacin, o estructuras de datos como la cola de prioridades (heap) o el diccionario (map). o La STL es una librer compleja, y que internamente hace uso de caracter a sticas bastante avanzadas del C++. Sin embargo, uno puede usar gran parte de la potencia que ofrece la STL de un modo escandalosamente fcil. Mi intencin al hacer estos apuntes es intentar resumir en unas pocas pginas a o a aquellas partes de la STL que, en mi opinin, pueden resultar de ms utilidad para aquellas personas o a que se estn preparando para participar en concursos de programacin, como la OIE (Olimpiada e o Informtica Espaola) o el ACM-ICPC (International Collegiate Programming Contest). a n Por ultimo, slo me queda indicar que si algn lector detecta errores (de cualquier tipo) en estos o u apuntes, le rogar que se pusiera en contacto conmigo para que pudiera corregirlos. a

Omer Gimnez e [email protected]

1

Cap tulo 1

Vectores y matrices: vectorUn vector (o tabla, o array) es la estructura de datos ms bsica: un contenedor que almacena a a n elementos del mismo tipo en n posiciones consecutivas de memoria. Si el vector se llama v, los elementos se denominan v[0], v[1], ..., v[n-1]. Para que tu programa use vectores, es necesario que aadas la l n nea #include al principio de tu cdigo. o Cuidado! En un vector v de n elementos, v[n] no existe, y el elemento v[0] existe siempre que el vector no sea vac o sea, que n > 0. Un programa nunca debe leer (ni, por supuesto, o, escribir) posiciones no existentes de un vector: en funcin del sistema operativo y de la posicin o o de memoria que se intente leer, puede pasar que el programa contine, o interrumpirse debido a u un fallo de segmentacin. o

Avanzado. Un fallo de segmentacin es el error que da el sistema operativo cuando detecta que o el programa est intentando acceder a memoria que no le corresponde. Ser ideal que siempre a a que un programa accediera a una posicin no reservada, el programa se interrumpiera con un o mensaje de error que avisara del error. Desgraciadamente, esto no siempre sucede as en C++, ya que puede ser que accedamos fuera del vector pero dentro de la memoria que le corresponde al programa. Existen distintas tcnicas para detectar este tipo de errores (por ejemplo, Valgrind) e pero, con diferencia, lo ms util es intentar no cometer el error desde un principio. Por ello, hay a que tener un cuidado exquisito cada vez que escribamos [ ] en nuestros programas. Todos los elementos de un vector son del mismo tipo, y ste se debe especicar en el momento de e crearlo: un vector es un vector cuyos elementos son de tipo T. El tamao del vector (es decir, el n nmero de elementos de tipo T que contiene) tambin se especica en el momento de su creacin; de u e o otro modo, el vector empieza vac Veamos un ejemplo. o.

//vector de 3 coordenadas enteras vector v(3); vector vst(10); //vector de 10 strings vector w; //vector de booleanos, vacio A diferencia de los arrays tradicionales del C, los vectores puede cambiar de tamao durante la n ejecucin del programa. Ms adelante veremos las instrucciones push_back y resize que nos permiten o a hacerlo.

2

Avanzado. Los elementos de un vector se guardan en el heap de memoria libre, y no en la pila del programa: en cierto modo, son equivalentes al uso del malloc del C o el new del C++, slo que o ms sencillos, puesto que no es necesario hacer nunca el free o el delete. Al modicar el tamao a n del vector la STL hace las operaciones necesarias (mover los elementos, reservar nueva memoria, etc.). Como es de suponer, esto tiene un coste, por lo que es preferible evitar las instrucciones que cambian el nmero de elementos de un vector. u Al crear un vector se nos permite pasar un segundo parmetro, de tipo T, que indica el valor a por defecto con el cual se inicializan los elementos del vector. Si no se especica ningn valor, como u en los ejemplos anteriores, se escoge el valor por defecto del tipo T, que es 0 para int, char, double, etc., false para bool, o "" (cadena vac para string. a) Para trabajar con un vector, al igual que con todas las estructuras de datos que veremos de la STL, se suelen usar los mtodos que la estructura ofrece. Es fcil encontrar en la web pgie a a nas que describen qu mtodos usar, y qu hacen estos mtodos (podis consultar, por ejemplo, e e e e e la documentacin ocial del vector de la STL, aunque fcilmente encontraris much o a e simos tutoriales, tanto en espaol como en ingls, que expliquen lo mismo). Por ejemplo, cuando escribimos v[3], n e en realidad estamos llamando al mtodo T &vector::operator[](int i) del vector v: un e mtodo que recibe un entero i y que devuelve (una referencia a) el valor que v contiene en la i-sima e e posicin. o Otros mtodos que tiene el vector v son v.size() (devuelve el tamao del vector), v.push_back(e) e n (aade un elemento e a v, incrementando en 1 su tamao), v.resize(n) (modica el tamao de v n n n para que pase a valer n, borrando o aadiendo elementos al nal, segn convenga). n u Los vectores, al igual que todas los contenedores de la STL, tienen la muy util propiedad de actuar como variables normales y corrientes: podemos asignarlos, compararlos, copiarlos, pasarlos como parmetro, hacer que una funcin los devuelva, etc. Por ejemplo, podemos escribir cdigo como a o o ste: e

vector v(10, 3); vector w = v; //w es una copia de v ++v[0]; //v y w son ahora distintos w.resize(0); //ahora w esta vacio v = w; //ahora v tambien esta vacio bool iguales = v==w; //iguales vale true

Avanzado Esta es una propiedad unica que tienen los vectores de la STL (y, en general, todas las estructuras de la STL), y que no comparten ni los arrays tradicionales de C, ni otros tipos de vectores de otros lenguajes, como por ejemplo Java. A esta propiedad se la denomina value semantics (semntica de valor). a En concreto, si tenemos dos vectores del mismo tipo T, podemos asignar uno al otro con el igual =, y compararlos con el doble igual == o el s mbolo de distinto !=. Tambin podemos compararlos con e el , >=,