C ++

Contenedores únicos y ordenados en C ++

Contenedores únicos y ordenados en C ++
6, 10, 2, 8, 4 es un conjunto; 2, 4, 6, 8, 10 es un conjunto de los mismos números enteros, dispuestos en orden ascendente. En Matemáticas, un conjunto tiene elementos únicos (elementos distintos), es decir, ningún elemento ocurre más de una vez. Además, un multiset es un conjunto, donde cualquier elemento puede ocurrir más de una vez. 6, 6, 10, 2, 2, 8, 4, 4, 4 es un conjunto múltiple. 2, 2, 4, 4, 4, 6, 6, 8, 10 es el mismo multiset, pero con los elementos dispuestos en orden ascendente. Este artículo no trata sobre multiset. Se trata de la estructura de datos de C ++ llamada, set.

Un mapa en el software es como una matriz, pero es una matriz con dos columnas en lugar de una. La primera columna tiene las claves y la segunda columna tiene los valores. Cada fila es un par, lo que hace un par clave / valor. Una clave está directamente relacionada con su valor.

Un ejemplo de mapa es 'c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10. El primer par clave / valor insertado aquí es 'c', 3, donde 'c' es la clave y 30 es el valor. Este mapa no está ordenado por claves. Ordenar este mapa por claves produce 'a', 10, 'b', 20, 'c', 30, 'd', 30, 'e', 40. Tenga en cuenta que puede haber valores duplicados, pero no claves duplicadas. Un mapa ordenado es un mapa ordenado por claves.

Un multiset es para un set, como un multimap es para un mapa. Esto significa que hay mapas con claves duplicadas. Un ejemplo de multimapa es 'a', 10, 'b', 20, 'b', 20, 'c', 30, 'c', 30, 'd ', 30, ' e ', 40. Y como se indicó anteriormente, este artículo no se ocupa de multimap, sino de la estructura de datos de C ++ denominada map.

En C ++, una estructura de datos es una estructura con propiedades (miembros de datos) y métodos (funciones miembro). Los datos de la estructura son una lista; un conjunto es una lista; un mapa es una lista de pares clave / valor.

Este artículo analiza los conceptos básicos de conjuntos y mapas en C ++, y para comprender mejor este artículo, el lector debería haber tenido un conocimiento básico de C++.

Contenido del artículo:

Clase y sus objetos:

En C ++, el conjunto, el mapa y otras estructuras similares se denominan contenedores. Una clase es una unidad generalizada con miembros de datos, que son variables, y funciones miembro que están relacionadas. Cuando a los miembros de datos se les dan valores, se forma un objeto. Sin embargo, un objeto se forma en un proceso llamado instanciación. Como una clase puede dar lugar a valores diferentes para las mismas variables de miembro de datos, se pueden crear instancias de diferentes objetos de la misma clase.

En C ++, un conjunto inutilizable es una clase, así como un mapa inutilizable. Cuando se crea una instancia de un objeto del conjunto inutilizable o del mapa inutilizable, el objeto se convierte en la estructura de datos real. Con las estructuras de datos de conjunto y mapa, el miembro de datos principal es una lista. Bueno, el conjunto y el mapa forman un grupo de contenedores llamados contenedores asociativos ordenados. El conjunto desordenado y el mapa desordenado también existen, pero desafortunadamente no se tratan en este artículo.

Creando un set o un mapa:

Instanciar un conjunto de su clase de conjunto es crear un conjunto; instanciar un mapa de su clase de mapa es crear un mapa. El objeto así creado recibe un nombre a elección del programador.

Para crear un conjunto, el programa debe comenzar con:

#incluir
#incluir
usando el espacio de nombres std;

Tenga en cuenta la directiva "#include ”, Que incluye la biblioteca de conjuntos que tiene la clase de conjunto de la que se instanciarán las estructuras de datos del conjunto.

Para crear un mapa, el programa debe comenzar con:

#incluir
#incluir
usando el espacio de nombres std;

Tenga en cuenta la directiva "#include ”, Que incluye la biblioteca de mapas que tiene la clase de mapa a partir de la cual se instanciarán las estructuras de datos del mapa.

La sintaxis para crear un conjunto vacío es:

colocar nombre del objeto

Ejemplo:

colocar setObj;

Un ejemplo para crear un set con contenido es:

colocar setObj (6, 10, 2, 8, 4);

La sintaxis para crear un mapa vacío es:

mapa nombre del objeto

Ejemplo:

mapa mapObj;

Un ejemplo para crear un mapa con contenido es:

mapa mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Conceptos básicos del iterador:

Un iterador es un puntero elaborado, que se puede utilizar para recorrer la lista de la estructura de datos desde el principio hasta el final.

La función del miembro begin ()

La función miembro begin () devuelve un iterador que apunta al primer elemento de la lista. El siguiente ejemplo ilustra esto para el conjunto:

colocar setObj (6, 10, 2, 8, 4);
colocar:: iterador iter = setObj.empezar();
cout << *iter << '\n';

Tenga en cuenta la forma en que begin () se ha utilizado con setObj y el operador de punto. iter es el objeto iterador devuelto. Además, tenga en cuenta la forma en que se ha declarado. * es el operador de indirección. Como se usa con iter, devuelve el primer elemento del conjunto; el primer elemento es 2 en lugar de 6; consulte la explicación a continuación.

El siguiente ejemplo ilustra el uso de la función begin () para el mapa:

mapa mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: iterador iter = mapObj.empezar();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Tenga en cuenta que la forma en que begin () se ha utilizado con mapObj y el operador de punto. iter es el objeto iterador devuelto. Además, tenga en cuenta la forma en que se ha declarado. "Primero", como se usa aquí, se refiere a la clave. "Segundo" se refiere al valor correspondiente a la clave. Observe cómo se han utilizado con iter para obtener los componentes del elemento inicial de la lista. El primer elemento es a, 10 en lugar de c, 30; consulte la explicación a continuación.

La función miembro "begin () const"

La función miembro "begin () const" devuelve un iterador que apunta al primer elemento de la lista cuando la declaración del conjunto comienza con const (para constante). Bajo esta condición, el valor en la lista, al que hace referencia el iterador devuelto, no puede ser cambiado por el iterador. El siguiente ejemplo ilustra su uso para el conjunto:

conjunto constante setObj (6, 10, 2, 8, 4);
colocar:: const_iterator iter = setObj.empezar();
cout << *iter << '\n';

Tenga en cuenta que la forma en que begin () se ha utilizado con setObj y el operador de punto. No se ha escrito "const" justo después de begin (). Sin embargo, "const" ha precedido a la declaración. iter aquí es el objeto iterador constante devuelto, que es diferente del iterador normal. Además, tenga en cuenta la forma en que se ha declarado. * es el operador de indirección; como se usa con iter, devuelve el primer elemento del conjunto. El primer elemento es 2 en lugar de 6; consulte la explicación a continuación.

El siguiente ejemplo ilustra el uso de la función "begin () const" para el mapa:

mapa const mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: const_iterator iter = mapObj.empezar();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Tenga en cuenta que la forma en que begin () se ha utilizado con mapObj y el operador de punto. No se ha escrito "const" justo después de begin (). Sin embargo, "const" ha precedido a la declaración. iter aquí es el objeto iterador constante devuelto, que es diferente del iterador normal. Además, tenga en cuenta la forma en que se ha declarado. "Primero", como se usa aquí, se refiere a la clave; "Segundo", como se usa aquí, se refiere al valor correspondiente a la clave. Observe cómo se han utilizado con iter para obtener los componentes del elemento inicial de la lista. El primer elemento es a, 10 en lugar de c, 30; consulte la explicación a continuación.

La función miembro end ()

La función miembro end () devuelve un iterador que apunta justo después del final de la lista. El siguiente ejemplo ilustra esto para el conjunto:

colocar setObj (6, 10, 2, 8, 4);
colocar:: iterador iter = setObj.final();
cout << *iter << '\n';

Tenga en cuenta la forma en que end () se ha utilizado con setObj y el operador de punto. iter es el objeto iterador devuelto. Además, tenga en cuenta la forma en que se ha declarado. * es el operador de indirección; como se usa con iter, devuelve el último + 1 elemento del conjunto. En la computadora del autor, este último elemento + 1 es 5, que no está en la lista. Entonces, tenga cuidado de no usar este elemento.

El siguiente ejemplo ilustra el uso de la función end () para el mapa:

mapa mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: iterador iter = mapObj.final();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Tenga en cuenta que la forma en que end () se ha utilizado con mapObj y el operador de punto. iter es el objeto iterador devuelto. Además, tenga en cuenta la forma en que se ha declarado. * es el operador de indirección; como se usa con iter, devuelve el último elemento + 1 del mapa. En la computadora del autor, este último elemento + 1 es , 0, que no está en la lista. Entonces, tenga cuidado de no usar este elemento.

La función miembro "end () const"

La función miembro "end () const" devuelve un iterador que apunta justo después del final de la lista cuando la declaración del conjunto comienza con const (para constante). Bajo esta condición, el valor en la lista, al que hace referencia el iterador devuelto, no puede ser cambiado por el iterador. El siguiente ejemplo ilustra su uso para el conjunto:

conjunto constante setObj (6, 10, 2, 8, 4);
colocar:: const_iterator iter = setObj.final();
cout << *iter << '\n';

Tenga en cuenta la forma en que end () se ha utilizado con setObj y el operador de punto. No se ha escrito "constante" justo después del final (). Sin embargo, "const" ha precedido a la declaración. iter es el objeto iterador devuelto. Además, tenga en cuenta la forma en que se ha declarado. * es el operador de indirección; como se usa con iter, devuelve el último + 1 elemento del conjunto.

El siguiente ejemplo ilustra el uso de la función "end () const" para el mapa:

mapa const mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: const_iterator iter = mapObj.final();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Tenga en cuenta que la forma en que end () se ha utilizado con mapObj y el operador de punto. No se ha escrito "constante" justo después del final (). Sin embargo, "const" ha precedido a la declaración. iter es el objeto iterador constante devuelto, que es diferente del iterador normal. Además, observe atentamente la forma en que se ha declarado.

Acceso a elementos para set y mapa:

Colocar

Con el conjunto, el elemento se lee usando el operador de indirección. Los dos primeros elementos de un conjunto se leen en el siguiente ejemplo:

colocar setObj (6, 10, 2, 8, 4);
colocar:: iterador iter = setObj.empezar();
cout << *iter << '\n';
++iter;
cout << *iter << '\n';

La salida es 2, luego seguida de 4; consulte la explicación a continuación. Para apuntar al siguiente elemento de la lista, el iterador se incrementa.

Nota: un elemento no se puede cambiar utilizando el operador de indirección para el conjunto. Por ejemplo, "* iter = 9;" no es posible.

mapa

Un mapa consta de pares clave / valor. Se puede leer un valor con la tecla correspondiente y cambiar con la misma tecla. El siguiente segmento de código ilustra esto:

mapa mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
cout << mapObj['b'] << '\n';
mapObj ['b'] = 55;
cout << mapObj['b'] << '\n';

La salida es:

20
55

El operador de punto no se ha utilizado aquí. En cambio, es el operador de corchetes, que toma la clave como contenido, el que se ha utilizado.

Orden de elementos en un conjunto o mapa:

Los elementos se pueden insertar en un conjunto, en cualquier orden. Sin embargo, una vez insertado, el conjunto reorganiza sus elementos en orden ascendente. El orden ascendente es el orden predeterminado. Si se necesita un orden descendente, entonces el conjunto debe declararse como en el siguiente ejemplo:

colocar > setObj (6, 10, 2, 8, 4);

Entonces, después del tipo, e.gramo., int, para la plantilla, hay una coma, seguida de "mayor”En los corchetes angulares.

Los elementos se pueden insertar en un mapa en cualquier orden. Sin embargo, una vez insertado, el mapa reorganiza sus elementos en orden ascendente por clave (solo) mientras mantiene la relación entre cada clave y su valor. El orden ascendente es el orden predeterminado; si se necesita un orden descendente, entonces el mapa debe declararse como en el siguiente ejemplo:

mapa > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Entonces, después del par de tipos, e.gramo., "Char, int", para la plantilla, hay una coma, seguida de "mayor”En los corchetes angulares.

Atravesando un conjunto

El bucle while o el bucle for con el iterador se pueden utilizar para recorrer un conjunto. El siguiente ejemplo utiliza un bucle for para recorrer un conjunto que se ha configurado en orden descendente:

colocar > setObj (6, 10, 2, 8, 4);
para (establecer:: iterador iter = setObj.empezar(); iter != setObj.final(); ++ iter)

cout << *iter << ";

La salida es:

10 8 6 4 2

Incrementar un iterador lo apunta al siguiente elemento.

Atravesando un mapa

El bucle while o el bucle for con el iterador se pueden utilizar para recorrer un mapa. El siguiente ejemplo utiliza un bucle for para recorrer un mapa que se ha configurado en orden descendente:

mapa > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
para (mapa:: iterador iter = mapObj.empezar(); iter != mapObj.final(); ++ iter)

cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

La salida es:

e, 40, d, 30, c, 30, b, 20, a, 10,

Incrementar un iterador lo apunta al siguiente elemento. "Primero", en el código, se refiere a la clave y "segundo" se refiere al valor correspondiente. Observe cómo se han obtenido estos valores para la salida.

Otras funciones de miembro de uso común:

La función size ()

Esta función devuelve un número entero, que es el número de elementos de la lista. Ponga el ejemplo:

colocar > setObj (6, 10, 2, 8, 4);
cout << setObj.size() << '\n';

La salida es 5.

Ejemplo de mapa:

mapa > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
cout << mapObj.size() << '\n';

La salida es 5.

La función insert ()

colocar

el conjunto no permite duplicar. Entonces, cualquier duplicado insertado se rechaza silenciosamente. Con el conjunto, el argumento de la función insert () es el valor que se insertará. El valor se coloca en una posición en la que el orden en el conjunto permanece ascendente o descendente. Ejemplo:

colocar setObj (6, 10, 2, 8, 4);
setObj.insertar (6);
setObj.insertar (9);
setObj.insertar (12);
para (establecer:: iterador iter = setObj.empezar(); iter != setObj.final(); ++ iter)

cout << *iter << ";

La salida es:

2 4 6 8 9 10 12

Nota: La función de miembro insert () se puede utilizar para completar un conjunto vacío.

mapa

mapa no permite duplicar por clave. Entonces, cualquier duplicado insertado se rechaza silenciosamente. Con el mapa, el argumento de la función insert () es el par clave / valor entre llaves. El elemento se coloca en una posición por tecla, en la que el orden en el mapa sigue siendo ascendente o descendente. Ejemplo:

mapa mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapObj.insertar ('e', 80);
mapObj.insertar ('f', 50);
mapObj.insertar ('g', 60);
para (mapa:: iterador iter = mapObj.empezar(); iter != mapObj.final(); ++ iter)
cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

La salida es:

a, 10, b, 20, c, 30, d, 30, e, 40, f, 50, g, 60,

Nota: la función de miembro insert () se puede utilizar para completar un mapa vacío.

La función vacía ()

Esta función devuelve verdadero si la lista está vacía y falso si no. Poner el ejemplo:

colocar setObj (6, 10, 2, 8, 4);
bool ret = setObj.vacío();
cout << ret << '\n';

La salida es 0 para falso, lo que significa que el conjunto aquí no está vacío.

Ejemplo de mapa:

mapa mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
bool ret = mapObj.vacío();
cout << ret << '\n';

La salida es 0 para falso, lo que significa que el mapa aquí no está vacío.

La función erase ()

colocar

Considere el siguiente segmento de código:

colocar setObj (10, 20, 30, 40, 50);
colocar:: iterador iter = setObj.empezar();
colocar:: iterador itr = setObj.borrar (iter);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';
itr = setObj.borrar (itr);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';

La salida es:

nuevo tamaño: 4
siguiente valor: 20
nuevo tamaño: 3
próximo valor: 30

La función erase () toma un iterador que apunta a un elemento como argumento. Después de borrar el elemento, la función erase () devuelve un iterador que apunta al siguiente elemento.

mapa

Considere el siguiente segmento de código:

mapa mapObj ('a', 10, 'b', 20, 'c', 30, 'd', 40, 'e', 50);
mapa:: iterador iter = mapObj.empezar();
mapa:: iterador itr = mapObj.borrar (iter);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
itr = mapObj.borrar (itr);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";

La salida es:

nuevo tamaño: 4
siguiente par de valores: b, 20
nuevo tamaño: 3
siguiente par de valores: c, 30

La función erase () toma un iterador que apunta a un elemento como argumento. Después de borrar el elemento, la función erase () devuelve un iterador que apunta al siguiente elemento.

La función clear ()

La función clear () elimina todos los elementos de la lista. Poner el ejemplo:

colocar setObj (6, 10, 2, 8, 4);
setObj.claro();
cout << setObj.size() << '\n';

La salida es 0.

ejemplo de mapa:

mapa mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapObj.claro();
cout << mapObj.size() << '\n';

La salida es 0.

Conclusión:

Una estructura de datos establecida en C ++ es una estructura en la que la lista de elementos se almacena en orden ascendente de forma predeterminada, o en orden descendente según la elección del programador. Todos los elementos del conjunto son únicos. Una estructura de datos de mapa en C ++ es una estructura en la que la lista es un hash de pares clave / valor, almacenados en orden ascendente de claves por defecto, o en orden descendente de claves por elección del programador. Las claves también son únicas y puede haber valores duplicados. El miembro de datos principal de cualquiera de las estructuras es la lista. Cualquiera de las estructuras tiene funciones miembro, algunas de las cuales se utilizan comúnmente.

Cómo cambiar el tamaño, el color y el esquema del puntero del mouse y del cursor en Windows 10
El puntero y el cursor del mouse en Windows 10 son aspectos muy importantes del sistema operativo. Esto también se puede decir de otros sistemas opera...
Motores de juegos gratuitos y de código abierto para desarrollar juegos de Linux
Este artículo cubrirá una lista de motores de juegos de código abierto y gratuitos que se pueden usar para desarrollar juegos 2D y 3D en Linux. Existe...
Tutorial de Shadow of the Tomb Raider para Linux
Shadow of the Tomb Raider es la duodécima incorporación a la serie Tomb Raider, una franquicia de juegos de acción y aventuras creada por Eidos Montre...