Programación en C++/Librería Estándar de Plantillas/Sets

Editores:

Oscar E. Palacios

Librería Estándar de Plantillas

C++ set estándarEditar

La plantilla set de C++ es un contenedor asociativo que contiene
una lista ordenada de objetos únicos.

El algoritmo de inserción de elementos para la estructura set está construido de manera tal que si se trata de agregar a la lista un elemento que ya existe la inserción es ignorada. Para empezar, le sugiero que compile, ejecute y analice el siguiente programa, en el cual se usa un set para contener en orden una lista de cadenas de caracteres (strings). En el programa se debe de observar como se trata de agregar dos veces el elemento "verde" y tal como debe de ser la segunda de las solicitudes de inserción es ignorada.

#include <cstdlib>
#include <iostream>
#include <set>
#include <string>

using namespace std;

void set01()
{
  set<string> colores;
  set<string>::iterator i = colores.begin();

  colores.insert("verde");
  colores.insert("amarillo");
  colores.insert("naranja");
  colores.insert("azul");
  colores.insert("blanco");

  // puesto que "verde" ya existe la siguiente insercion es ignorada
  colores.insert("verde");

  i = colores.begin();

  cout << "Numero de colores: " << colores.size() << endl;
  while(i != colores.end() ) cout << "\t" << *i++ << endl;
}

int main(int argc, char *argv[])
{
  set01();
  system("PAUSE");
  return EXIT_SUCCESS;
}

Inserción de datos (insert)Editar

La inserción de datos en un set se logra a travez de la función insert(). La sintaxis para insert es:

  • iterator insert( iterator i, const TYPE& val );
Inserta el elemento val en la posición indicado por i. La posición es solamente una formalidad puesto que los elementos en un set son insertados en un orden especifico por medio de un algoritmo interno de la plantilla set.
  • void insert( input_iterator start, input_iterator end );
Inserta un grupo de elementos indicados por star y end. Esta forma es útil para hacer copias de un set en otro.
  • pair<iterator,bool> insert( const TYPE& val );
Esta última forma de inserción puede resultar mejor que la primera, ya que con esta no debemos de indicar la posición de inserción y además que regresa un resultado que puede ser ignorado o utilizado para comprobación. Tal como se muestra en el siguente programa.
#include <cstdlib>
#include <iostream>
#include <set>
#include <string>

using namespace std;

void set02()
{
  cout << "\n...prueba 2...\n";
  set<string> colores;
  set<string>::iterator i = colores.begin();

  colores.insert(i, "verde");
  colores.insert(i, "amarillo");
  colores.insert(i, "naranja");
  colores.insert(i, "azul");
  colores.insert(i, "blanco");
  colores.insert(i, "rojo");

  pair<_Rb_tree_const_iterator<string>, bool> p;

  // puesto que "verde" ya existe la siguiente insercion es ignorada
  p = colores.insert("verde");

  // comprobacion
  p.second ? cout << "\tInsercion Ok\n" : cout << "\tInsercion ignorada\n";

  i = colores.begin();
  cout << "Numero de colores: " << colores.size() << endl;
  while(i != colores.end() ) cout << "\t" << *i++ << endl;
}

int main(int argc, char *argv[])
{
  set02();
  system("PAUSE");
  return EXIT_SUCCESS;
}
Librería Estándar de Plantillas