Establecer intersección en C ++

Establecer intersección en C ++
Los siguientes son conjuntos de dos caracteres:
p = 'h', 'g', 'f', 'e', ​​'d'
q = 'j', 'i', 'h', 'g', 'f'

En C ++, la intersección de estos dos conjuntos sería:

r = 'f', 'g', 'h'

organizado en orden ascendente basado en la configuración predeterminada. La intersección de otros tipos de conjuntos es posible, como la intersección de conjuntos de enteros, intersección de conjuntos de flotadores, intersección de conjuntos de dobles, etc.

La clase establecida en la biblioteca de conjunto C ++, que debe incluirse en el programa para el trabajo establecido, no tiene una función miembro para la intersección. Entonces, para obtener la intersección de conjuntos, la biblioteca de algoritmo, que tiene la función set_intersection (), debe incluirse en el programa.

La biblioteca de algoritmo C ++ tiene una serie de funciones sobrecargadas de set_intersection. Solo los dos más simples se explican en este artículo. Sin embargo, antes de que comiencen las explicaciones, el lector debe saber la diferencia entre el iterador de salida, el iterador de entrada y el iterador delantero.

Outputiterator y reenviables

Un iterador es un puntero de clase. Un outputiterator es un iterador al que se puede asignar un valor con la expresión desferida. Por ejemplo, si el iterador es yo para enteros, entonces;

*i = 5;

haría señalar la ubicación de memoria que tiene el valor, 5.

Un inputIterator es un iterador cuya expresión desferida devolvería el valor que el iterador apunta. Por ejemplo, si el iterador es I para enteros, y apunta a la ubicación de memoria que tiene el número 7, entonces;

int num = *i;

haría que num sostenga el valor, 5.

Un reenvío es una forma elaborada del iterador de entrada.

Rangos

Cuando los valores destinados a un conjunto se han insertado en el conjunto, los valores se clasifican en orden ascendente en función de la configuración predeterminada. Con conjuntos, se pueden usar dos iteradores delanteros para identificar una variedad de elementos en el conjunto. Este artículo se refiere a todo el rango del conjunto. El siguiente programa muestra cómo obtener los iteradores delanteros que representan la gama completa de un conjunto:

#incluir
#incluir
usando el espacio de nombres STD;
int main ()

colocar p = 'h', 'g', 'f', 'e', ​​'d';
colocar:: iterator primero = P.comenzar();
colocar:: iterador último = P.fin();
regresar 0;

Tenga en cuenta el uso de las funciones de miembros Begin () y End () de la clase establecida.

Para el propósito de la intersección de dos conjuntos completos, habrá First1 y Last1 para el primer set; y First2 y Last2 para el segundo set; para ambos rangos completos.

Iterador de salida

Las dos funciones set_intersection consideradas en este artículo devuelven un iterador de salida. Desafortunadamente, la clase establecida no tiene un iterador de salida. Bueno, la clase vectorial tiene. Esto significa que el iterador de salida de la clase vectorial que simplemente se llama iterador, se puede usar para recibir el iterador de salida devuelto por la función set_intersection (). Otra buena noticia es que este iterador vectorial puede servir como iterador de salida y iterador de entrada. No olvide incluir el vector para usarlo en el programa.

Las dos funciones sobrecargadas de set_intersection mencionadas anteriormente ahora se pueden discutir.

Función set_intersection básica

La sintaxis para esta función en la biblioteca de algoritmo es:

plantilla
Constexpr outputiterator
set_intersection (inputIterator1 First1, Inputiterator1 Last1,
InputIterator2 First2, Inputiterator2 Last2, resultado de la salida)

Outputiterator es el iterador de salida de retorno, obtenido de la clase Vector. Estaría señalando justo después del último elemento práctico en el vector. Esto significa que el tamaño del vector vacío para recibir la intersección de los conjuntos debe estimarse que está por encima del número de valores en la intersección. El último resultado del argumento es el puntero de iterador de salida que apunta al inicio del vector, que recibirá la intersección de conjuntos.

Con el vector, el iterador de salida devuelto, que también es un iterador de entrada, se puede usar para mostrar los valores de la intersección de los conjuntos utilizando el bucle for-loop. Con la introducción anterior para este artículo, el resto de los parámetros de la función se explican por sí mismas. El siguiente programa muestra cómo usar esta función:

#incluir
#incluir
#incluir
#incluir
usando el espacio de nombres STD;
int main ()

colocar p = 'h', 'g', 'f', 'e', ​​'d';
colocar:: iterator First1 = P.comenzar(); set :: iterator Last1 = P.fin();
colocar q = 'j', 'i', 'h', 'g', 'f';
colocar:: iterator First2 = Q.comenzar(); set :: iterator Last2 = Q.fin();
vector VTR (10);
vector:: iterator outit = set_intersection (First1, Last1, First2, Last2, VTR.comenzar());
VTR.cambiar el tamaño (out - vtr.comenzar());
para (outit = vtr.comenzar(); fuera de eso != VTR.fin(); outit ++)
cout << *outIt << ", ";
cout << endl;
regresar 0;

Observe que el vector tenía que cambiar el tamaño para contener solo los elementos de la intersección después de la función set_intersection () se había llamado. La salida es:

F, G, H,

Función básica de set_intersection con comparación personalizada

La sintaxis para esta función en la biblioteca de algoritmo es:

plantilla
Constexpr outputiterator
set_intersection (inputIterator1 First1, Inputiterator1 Last1,
InputIterator2 First2, Inputiterator2 Last2,
Resultado de salida, comparar comp);

Outputiterator es el iterador de salida de retorno obtenido de la clase Vector. Estaría señalando justo después del último elemento práctico del vector. Esto significa que el tamaño del vector vacío para recibir la intersección de los conjuntos debe estimarse que está por encima del número de valores en la intersección. El resultado del argumento de último pero uno es el puntero del iterador de salida que apunta al inicio del vector, que recibirá la intersección de conjuntos.

Con el vector, el iterador de salida devuelto, que también resulta ser un iterador de entrada, se puede usar para mostrar los valores de la intersección de los conjuntos utilizando el bucle for-loop.

Comp, es una función definida por programador. Puede ser:

bool comp (char a, char b)
Si (a != b)
devolver verdadero;
demás
falso retorno;

Esta función comp () devuelve verdadero o falso. De la introducción de este artículo anterior, el resto de los parámetros de la función set_intersection se explican por sí mismas.

Con el encabezado del programa anterior, la siguiente función main () utilizará la función comp () anterior con éxito.

int main ()

colocar p = 'h', 'g', 'f', 'e', ​​'d';
colocar:: iterator First1 = P.comenzar(); colocar:: iterator Last1 = P.fin();
colocar q = 'j', 'i', 'h', 'g', 'f';
colocar:: iterator First2 = Q.comenzar(); colocar:: iterator Last2 = Q.fin();
vector VTR (10);
vector:: iterator outit = set_intersection (First1, Last1, First2, Last2, VTR.begin (), comp);
VTR.cambiar el tamaño (out - vtr.comenzar());
para (outit = vtr.comenzar(); fuera de eso != VTR.fin(); outit ++)
cout << *outIt << ", ";
cout << endl;
regresar 0;

La salida es:

F, G, H,

Igual que antes.

Conclusión

La clase establecida en la biblioteca de conjunto C ++, que debe incluirse en el programa para el trabajo establecido, no tiene una función miembro para la intersección. Entonces, para obtener la intersección de conjuntos, la biblioteca de algoritmo, que tiene la función set_intersection (), debe incluirse en el programa.

La biblioteca de algoritmo C ++ tiene una serie de funciones sobrecargadas de set_intersection. A partir de enero de 2022, dos de estas funciones que probablemente han sido implementadas por su compilador, se han explicado anteriormente. Los compiladores aún deben implementar el resto de las funciones SET_INTERSECTION () sobrecargadas que se encuentran en la especificación C ++.