La forma de obtener genericidad en C es por void *
, por lo tanto, va a utilizar punteros de todos modos, y los punteros a diferentes objetos son únicos. Esto significa que necesita un mapa hash o árbol binario que contenga punteros, y esto funcionará para todos los objetos de datos.
El inconveniente de esto es que no puede introducir valores de forma independiente. No puede tener un conjunto que contenga el valor 5; tiene que asignar 5 a una variable, lo que significa que no coincidirá con un 5 al azar. Puede ingresarlo como (void *) 5
, y para fines prácticos es probable que funcione con enteros pequeños, pero si sus enteros pueden entrar en tamaños suficientemente grandes para competir con los indicadores esto tiene una probabilidad muy pequeña de fallar.
Tampoco funciona con valores de cadena. Dado char a[] = "Hello, World!"; char b[] = "Hello, World!";
, un conjunto de punteros encontraría que a
y b
son diferentes. Es probable que desee ajustar los valores, pero si le preocupan las colisiones hash, debe guardar la cadena en el conjunto y hacer un strncmp()
para comparar la cadena almacenada con la cadena de sondeo.
(Hay problemas similares con números de punto flotante, pero tratando de representar los números de punto flotante en juegos es una mala idea en primer lugar.)
Por lo tanto, usted probablemente querrá un valor etiquetado, uno etiqueta para cualquier tipo de objeto, uno para el valor entero, y uno para el valor de cadena, y posiblemente más para diferentes tipos de valores. Es complicado, pero factible.
Tengo la misma pregunta aquí: http://stackoverflow.com/questions/2537681/how-to-implement-a-set. Tal vez ayude! –
... ¿o pregunta de entrevista? – vladr
Conector desvergonzado: escribí una biblioteca B-tree en memoria en C: http: //ccan.ozlabs.org/info/btree.html. Un árbol B cumple esencialmente la misma función que un árbol binario con respecto a los conjuntos. –