Documentos de Académico
Documentos de Profesional
Documentos de Cultura
STL
Librería Estándar de Plantilla
Por:
Adolfo Ccanto Llactahuaman
Comunidad ACM-ICPC-UNI
LIMA - PERU
2008
1/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
CONTENIDO
STL, definición.....................................................................................................................................4
Clase de Contenedores:....................................................................................................................5
VECTOR.............................................................................................................................................. 6
Declaracion: ................................................................................................................................... 6
Funciones Miembros: ..................................................................................................................... 6
push_back: .............................................................................................................................. 6
size: ........................................................................................................................................... 6
begin: ..........................................................................................................................................6
end: .............................................................................................................................................7
erase: .......................................................................................................................................... 7
clear: ...........................................................................................................................................7
empty: .........................................................................................................................................7
asignación: ........................................................................................................................... 7
find: .......................................................................................................................................... 7
reverse: ....................................................................................................................................... 8
sort: .........................................................................................................................................8
PROBLEMA: ...................................................................................................................................... 9
SOLUCION:.......................................................................................................................................10
DEQUE...............................................................................................................................................11
LIST....................................................................................................................................................12
push_front: ................................................................................................................................... 12
push_back: ................................................................................................................................... 12
iterator: ..........................................................................................................................................12
PRIORITY_QUEUE.......................................................................................................................... 16
PROBLEMA: .................................................................................................................................... 17
SOLUCION: ............................................................................................................................... 18
2/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
SET ( conjunto).................................................................................................................................. 20
insert: .......................................................................................................................................... 20
size: .............................................................................................................................................. 20
iterator: ..........................................................................................................................................20
find: ..............................................................................................................................................20
PROBLEMA: .................................................................................................................................... 21
SOLUCION:
MAP .................................................................................................................................................. 23
CLASE STRING................................................................................................................................ 25
declaracion:....................................................................................................................................25
ingreso de datos:............................................................................................................................ 25
lectura:........................................................................................................................................... 25
concatenacion:............................................................................................................................... 25
longitud: .................................................................................................................................... 25
substring: .......................................................................................................................................25
find : .............................................................................................................................................26
PROBLEMA: .................................................................................................................................... 28
SOLUCION:.......................................................................................................................................29
PROBLEMA: .................................................................................................................................... 30
SOLUCION:.......................................................................................................................................32
REFERENCIAS................................................................................................................................. 33
3/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
INTRODUCCION
En este documento recopilo algunas de las informaciones mas importantes sobre las Librerías
Estándar de Plantillas, así como los conceptos básicos que ayudaran ah impulsar a la investigación
de este tema, y aplicaciones de estas librerías para el fácil manejo y planteamiento al dar solución a
algún problema, basado básicamente en problemas relacionados al concurso de programación
ACM.
Es importante debido a que estas librerías nos ahorraran tiempo al momento de codificar, claro que
antes de codificar debemos pensar y analizar la solución optima y posteriormente usar las librerías
del STL para tal fin.
4/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
STL, definición
El STL es una librería de C++ que incluye estructura de datos y algoritmos que utilizaremos por su
facilidad de uso.
El C++ incorpora todas las librerías de Estándar C y también añade sus propias librerías. Estas
librerías son mucho más potentes que las de C.
Un contenedor es cualquier TAD cuyas funciones principales es insertar, quitar elementos el cual
esta implementado con clases genéricas o clase de plantillas, quiere decir una clase cuyo atributo
toma cualquier tipo de datos (enteros, cadenas, estructuras,…) y su implementación es única para
todas ellas.
Clase de Contenedores:
Contenedores Secuenciales:
● vector
● deque
● list
Contenedores Asociativos:
● set
● map
● multiset
● hash_set
● hash_map
Contenedores Adaptadores:
● snack
● queue
● priority_queue
Clase string
Flujo de datos
5/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
VECTOR
Permite almacenar elementos del mismo tipo, es parecido al Arreglo aunque el numero de
elementos no se precisa ya que es dinámico el almacenamiento de datos, se puede acceder a un
elemento por su índice por ello se dice que es de acceso aleatorio, el tiempo de acceso inserción y
borrado es en tiempo constante O(1)
Declaracion:
vector<tipo> nombre;
vector<string> a;
vector<int> b(100); // vector de 100 elementos
vector<poligonos>b;
Funciones Miembros:
push_back:
para insertar datos
vector<int> v;
v.push_back(2);
v.push_back(5);
v.push_back(4);
v.push_back(1);
v.push_back(20);
size:
devuelve el tamaño del vector
int n = v.size();
for(int i=0;i<n;i++)
cout<< v[i]<<endl;
begin:
devuelve un iterador que referencia el comienzo del vector
int n = v.size();
for(int i=0;i<n;i++)
cout<< *(v.begin()+i)<<endl;
6/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
end:
devuelve un iterador que referencia el final del vector
int n = v.size();
for(int i=n;i>=1;i--)
cout<< *(v.end()-i)<<endl;
erase:
elimina los elementos que se encuentran entre los iteradores indicados
clear:
elimina todos los elementos del Vector
v.clear();
empty:
devuelve VERDAD si el vector esta vacío
if(v.empty()==false)
cout<<”hay elementos aun en el vector”<<ende;
asignación:
vector<int >b;
b.push_back(3);
b.push_back(5);
b.push_back(1);
b.push_back(0);
find:
busca un elemento en el vector , esto lo hace en un tiempo lineal O(n)
si encuentra el elemento retorna el iterador donde se encontró
find( inicio de búsqueda, final de búsqueda, elemento a buscar )
if ( find(a.begin(),b.end(),5) ! = a.end() )
cout<<”Elemento encontrado”<<endl;
else cout<<”no se encontró dicho elemento”<<ende;
7/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
reverse:
invierte los elementos del contenedor incluidos en el rango establecido por un
iterador inicial y otro final reverse( iterador_inicial, iterador_final)
// a ={3,5,1,0}
reverse(a.begin(),a.begin()+2) ; // invertimos desde a[0] hasta a[1]
// a ={5,3,1,0}
reverse(a.begin(),a.end()); // invierte todo el vector
// a ={0,1,3,5}
sort:
ordena de manera creciente los elementos de un contenedor incluidos en el
rango establecido por un iterador inicial y otro final
// b ={3,5,1,0}
sort(b.begin() , b.end());
// b={0,1,3,5}
8/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
PROBLEMA:
S Number ( TJU - 2859)
Dado un conjunto de números. El S-number es el máximo elemento
menor que el mayor de todos. Por ejemplo para el conjunto el cual
contiene 8 números: 3, 6, 0, -5, 7, 7, 6, 2. El número mayor es 7.
Así que el S-number es 6 porque es máximo menor que 7.
Input
Output
Sample Input
8
3 6 0 -5 7 7 6 2
0
Sample Output
9/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
SOLUCION:
//////////////////////////////////////////////////
// Coder: Ad
//////////////////////////////////////////////////
#include<iostream>
#include<vector>
#define fa(i,a,b) for(int i=a;i<b;++i)
#define pb push_back
using namespace std;
int main(){
int n,x;
while(scanf("%d",&n)==1&&n){
vector<int>a;
fa(i,0,n){scanf("%d",&x); a.pb(x);}
// almacenamos elementos en el vector
sort(a.rbegin(),a.rend());
// ordena los elementos de mayor a menor
int m=a[0];
fa(i,1,a.size())if(a[i]!=m){cout<<a[i]<<endl;break;}
}
}
//////////////////////////////////////////////////
10/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
DEQUE
Las Colas de doble extremo son como los vectores, excepto que en éstas la inserción y borrado de
elementos es más rápida, además de permitir insertar y borrar elementos al principio así como al
final del contenedor. La mayoría de los métodos aplicables a la clase vector son aplicables a la
clase deque, pero la clase deque posee además los métodos push_front y pop_front para insertar y
borrar elementos al principio
Tiene acceso aleatorio es decir es indexado.
11/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
LIST
push_front:
para insertar elementos del contenedor en el inicio
list<char>L;
L.push_front(‘c’);
L.push_front(‘a’);
push_back:
para insertar elementos del contenedor en el final
L.push_back(‘b’);
iterator:
sirve para acceder a los elementos
list<char>::iterator it;
for(it=L.begin(); it!=L.end(); it++)
cout<<*it<<endl;
12/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
STACK ( LIFO )
PUSH
POP
13/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
tendriamos:
stack<int>pila;
pila.push(2);
pila.push(3);
pila.push(5);
14/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
QUEUE ( FIFO )
PUSH
POP
tendriamos:
queue<int>Q;
q.push(1);
q.push(5);
q.push(3);
q.push(6);
while(!Q.empty()){
cout<<Q.front()<<endl;
q.pop();
}
15/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
PRIORITY_QUEUE
Idea: cuando se realiza en ingreso de pacientes a un hospital simula una cola simple pero cuando
viene un paciente grave el tendrá la mayor prioridad para estar en el primera posición de la cola ,
por ello el nombre de Colas de prioridad
cout<<q.top()<<endl; // 20
while(!q.empty()){
cout<<q.top()<<endl; // 20 15 10 5 1
q.pop();
}
priority_queue<int,vector<int>,greater<int> >d;
d.push(1);
d.push(3);
d.push(5);
while(!d.empty()){
int t=d.top();
cout<<t<<endl; // 1 3 5
d.pop();
}
16/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
PROBLEMA:
UGLY NUMBERS
(http://acm.uva.es/p/v1/136.html)
Ugly numbers son numeros cuyos factores primos son unicamente 2, 3 or 5. La secuencia:
No hay entradas para este programa. La salida debe consisitir de una sola linea como se muestra
abajo, con <number> reemplazado por el numero calculado.
Sample output
17/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
SOLUCION:
//////////////////////////////////////////////////
// Coder: Ad
//////////////////////////////////////////////////
#include<iostream>
#include<set>
#include<vector>
#include<queue>
using namespace std;
int main(){
set< long long >s;
// aca almacenamos los elementos ordenados
pq.pop();
if(s.find(a)==s.end()){s.insert(a);pq.push(a);} // si a no esta en el conjunto
if (s.find(b)==s.end()){s.insert(b);pq.push(b);} // si b no esta en el conjunto
if (s.find(c)==s.end()){s.insert(c);pq.push(c);} // si c no esta en el conjunto
}
int k=1;long long t;
fore(it,s){if(k==1500)t=*it;k++;}
cout<<"The 1500'th ugly number is "<<t<<"."<<endl;
18/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
CONTENEDORES ASOCIATIVOS
19/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
SET ( conjunto)
insert:
ingresar datos
set<int>s;
s.insert(2);
s.insert(5);
s.insert(4);
s.insert(3);
s.insert(3);
size:
tamaño del contenedor
int n=s.size();
cout<<n<<endl; // 4
iterator:
para realizar el recorrido del contenedor
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++){
cout<<*it<<endl; // 2 3 4 5
}
find:
realiza la búsqueda de un elemento en el contenedor
if( s.find(3) !=s.end())
cout<<”si existe”<<endl;
else cout<<”no existe ”<<endl;
20/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
PROBLEMA:
DOUBLES ( TJU – 1930 )
Como parte de un curso de aritmética, se entrega a los
participantes listas de numeros generadas al azar de 2 a 15
enteros positivos únicos y se les pide determinar cuántos números
en cada lista es dos veces algún otro numero de la misma lista.
Deberá crear un programa para realizar dicha tarea. Este programa
recibira como entrada las listas y mostrará la respuesta correcta
para cada grupo. Por ejemplo, teniendo en cuenta la lista
1 4 3 2 9 7 18 22
1 4 3 2 9 7 18 22 0 3
2 4 8 10 0 2
7 5 11 13 1 3 0 0
-1
21/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
SOLUCION:
//////////////////////////////////////////////////
// Coder: Ad
//////////////////////////////////////////////////
#include<iostream>
#include<string>
#include<vector>
#include<set>
using namespace std;
int main(){
int x,ct;
while(cin>>x){
ct=0;
if(x==-1)break;
// si el primer elemento es -1 acaba la lectura de datos
if(x==0)break;
// si ingresa un numero 0 acaba la lectura para la lista
v.push_back(x);
// almacenamos los elementos diferentes a 0
}
int n=v.size();
// se almacena la cantidad de numeros que ingresamos
set<int>s;
for(int i=0;i<n;i++)s.insert(2*v[i]);
// almacenamos en s los dobles
for(int i=0;i<n;i++)
if(s.find(v[i])!=s.end())
// buscamos en time logaritmico si algun numero es doble
ct++;
cout<<ct<<endl;
}
}
22/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
MAP
(MAPEO)
Es un contenedor al igual que el set formado por un conjunto de la clase pair .
pair<int,int> complejo1;
complejo1.fisrt = 2 ;
complejo1.second=3;
también se puede ingresar los datos a un pair de forma directa usando su constructor de esta
forma:
complejo1=make_pair(2,3);
pero para almacenar un conjunto de complejos , podría usar un vector de pairs es decir:
pair<int,int> numero;
for(int i=0;i<n;i++){
cout<<"complejo :"<<endl:
cout<<"parte real = "; cin>>x;
cout<<"parte imaginaria = "; cin>>y;
numero.first=x;
numero.second=y;
conjunto_complejo.push_back(numero);
}
for(int i=0;i<n;i++){
23/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
cout<<"complejo :"<<endl:
cout<<"parte real = "; cin>>x;
cout<<"parte imaginaria = "; cin>>y;
conjunto_complejo.push_back(make_pair(x,y));
}
El map es un contenedor basado en un conjuntos de pair, en donde en los first se almacena la clave
primaria (elementos que nunca se repetirán) , y en los second se almacena el valor referido a su
clave primaria .
Por ejemplo un map de personas donde la llave primaria que nunca se repite es el DNI y el valor
puede ser la edad . su implementacion se basa en arboles binarios.
map<int,int>m;
m[1]=15;
m[2]=17;
m[3]= 21;
m[4]=20;
if(m.find(5)!=m.end()){
cout<<”se encontro dicha clave”<<ende;
}
else cout<<”no existe dicha clave”<<ende;
for(it=m.begin();it!=m.end();it++){
cout<<(*it).first<<" "<<(*it).second<<endl;
// tambien se puede escribir como sigue sin el “*”
cout<<it->first<<" "<<it->second<<endl;
}
Obs: si insertamos un elemento del map con una misma clave el valor se actualiza.
24/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
CLASE STRING
declaracion:
string cadena;
ingreso de datos:
string cadena="acm";
lectura:
solo una palabra: cin>>cadena;
una linea de palabras: getline(cin,cadena);
concatenacion:
string a="acm";
string b="icpc";
string c= a+" "+b;
cout<<c<<endl; // c="acm icpc"
longitud:
nos devuelve la longitud de la cadena
int n=c.size();
cout<<"la cadena tiene "<<n<<" caracteres"<<endl;
substring:
permite extraer una subcadena
substring(posicion_inicial , longitud a extraer);
25/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
find :
devuelve la posición donde empieza la cadena buscada
string a="acmc";
int p= s.find(‘c’);
cout<<p<<endl; // p=1 encuentra la primera ocurrencia y devuelve el valor
pero si no encuentra la letra o cadena devuelve el valor -1
26/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
conversion de datos:
float x;
string s="123.156";
stringstream in;
in<< s;
in>>x;
cout<<x<<endl; // ahora en x se almaceno 123.156 como numero real
distribución de datos
int g1,g2;
stringstream in;
in<<s;
in>>a>>g1>>c>>g2>>b;
if(g1>g2)cout<<"gano "<<a;
else if(g1<g2)cout<<"gano "<<b<<endl;
else cout<<"empates"<<endl;
27/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
PROBLEMA:
BABELFISH ( TJU – 1378 )
Usted acaba de viajar de Waterloo, una ciudad grande. Las personas ahí hablan un dialecto
incomprensible de una lengua extranjera. Afortunadamente, usted tiene un diccionario para ayudar a
comprenderlos.
La entrada consta de hasta 100,000 entradas de diccionario, seguido por una línea en blanco,
seguido por un mensaje de hasta 100,000 palabras. Cada entrada de diccionario es una línea que
contiene una palabra inglesa, seguido por un espacio y una palabra de la lengua extranjera. Ninguna
palabra extranjera aparece más de una vez en el diccionario. El mensaje es una secuencia de las
palabras en la lengua extranjera, una palabra sobre cada línea. Cada palabra en la entrada es una
secuencia de a lo más 10 letras minúsculas. El resultado es el mensaje traducido a inglés, una por
cada renglón. Las palabras extranjeras que no se encuentren en el diccionario deben ser traducido
como "eh".
atcay
ittenkay
oopslay
28/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
SOLUCION:
//////////////////////////////////////////////////
// Coder: Ad
//////////////////////////////////////////////////
#include<iostream>
#include<map>
using namespace std;
int main(){
map<string,string> mapa;
// aca guardamos el diccionario
string a,b,s;
while(getline(cin,s)){
if(s=="")break;
stringstream in(s);
in>>a>>b;
// “a” es palabra conocida y “b” es palabra desconocida
mapa[b]=a;
// en el first guardamos la palabra desconocida “b”
// en el second guardamos su significado “a”
}
while(cin>>a){
if(mapa.find(a)!=mapa.end())
// buscamos en time logaritmico si existe “a”
cout<<mapa[a]<<endl;
else
cout<<"eh"<<endl ;
}
29/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
PROBLEMA:
THE HEROES ( TJU - 2781 )
Dr. Suresh ha descubierto que piezas genéticas especiales permitirían que los seres humanos tengan
habilidades especiales, como volar, para el tiempo, etc. Le gustaría mostrar una lista que contendra a todas
las personas especiales. Una persona individual está en la lista si y solo si su código genético contiene uno
de las piezas especiales como una sub-cadena. Por favor ayude a Dr.Suresh a realizar dicha tarea.
Input
La primera línea contiene un número entero N, que indica la cantidad de piezas genéticas especiales. Las
siguientes N lineas contienen un cadena, cada una indica el código genético de cada pieza. La siguiente line
contiene un numero entero M, que indica la cantidad de personas individuales a analizar. La siguientes M
lineas ,cada uno tiene un cadena, que es el código genético de cada persona individual.
Output
Para cada persona, si está en la lista, muestre en una linea "A new hero discovered". De lo contrario muestre
“Just an ordinary person".
Notes
* Un codigo genetico es un string que contiene 'A', 'T', 'C' y 'G' solamente y no contiene espacios en
blanco.
* Un string A es un substring de B, si y solo si A aparece continuamente en B ( ejemplo ATC un
substring de AATCTC, pero ATT no lo es).
* El código genético de un Héroe puede contener varios tipos de códigos genéticos especiales como
substrings.
Constraints
* 1 ≤ N ≤ 10, 1 ≤ M ≤ 50
* La longitud de cualquier código genético es mayor a 0 y no excede a 50.
30/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
Sample Input
2
ATA
ATC
3
ACATAG
AATTCCGG
ATCGGATACG
Sample Output
31/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
SOLUCION:
//////////////////////////////////////////////////
// Coder: Ad
//////////////////////////////////////////////////
#include<iostream>
#include<vector>
#define fa(i,a,b) for(int i=a;i<b;++i)
#define pb push_back
using namespace std;
int main()
{int n,m;
scanf("%d",&n);
// leemos el numeros de piezas a ingresar
vector<string>x,y;
string a;
while(n--){cin>>a;x.pb(a);}
// almacenamos las piezas geneticas especiales
scanf("%d",&m);
while(m--){cin>>a;y.pb(a);}
// almacenamos los codigos geneticos de las personas
fa(i,0,y.size())
// para cada persona buscamos alguna pieza genetica especial
{int k=1;
fa(j,0,x.size())
if(y[i].find(x[j])!=-1)
// si encontre una pieza genetica especial entonces k=0
{ k=0;
break;
}
if(k)puts("Just an ordinary person");
else puts("A new hero discovered");
}
}
32/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008
LIMA-PERU 2008
REFERENCIAS
Para mayor informacion sobre las STL pueden visitar la siguiente pagina:
● http://www.sgi.com/tech/stl/stl_index.html
33/33
Tutorial Por: Adolfo Ccanto Llactahuaman
STL Comunidad ACM-ICPC-UNI 2008