Путь получения универсальности в C равен void *
, так что вы все равно будете использовать указатели, а указатели на разные объекты уникальны. Это означает, что вам нужна карта хэша или двоичное дерево, содержащее указатели, и это будет работать для всех объектов данных.
Недостатком этого является то, что вы не можете вводить rvalues самостоятельно. У вас не может быть набора, содержащего значение 5; вам нужно назначить 5 переменной, что означает, что она не будет соответствовать случайному 5. Вы можете ввести ее как (void *) 5
, и для практических целей это, скорее всего, будет работать с небольшими целыми числами, но если ваши целые числа могут быть в больших размерах чтобы конкурировать с указателями, это имеет очень небольшую вероятность неудачи.
И это не работает со строковыми значениями. Учитывая char a[] = "Hello, World!"; char b[] = "Hello, World!";
, набор указателей найдет a
и b
будет отличаться. Вероятно, вы захотите хэш-значения, но если вас беспокоят хеш-коллизии, вы должны сохранить строку в наборе и сделать strncmp()
для сравнения сохраненной строки с пробной строкой.
(Там же аналогичные проблемы с числами с плавающей точкой, но при попытке представления чисел с плавающей точкой в наборах это плохая идея в первой очереди.)
Таким образом, вы, вероятно, хотите помеченное значение, один тег для любого типа объекта, один для целочисленного значения и один для строкового значения и, возможно, больше для разных значений. Это сложно, но выполнимо.
У меня такой же вопрос здесь: http://stackoverflow.com/questions/2537681/how-to-implement-a-set. Может быть, это помогает! –
... или вопрос на собеседование? – vladr
Бесстыдный плагин: я написал библиотеку B-дерева в памяти в C: http: //ccan.ozlabs.org/info/btree.html. B-дерево выполняет, по существу, ту же роль, что и бинарное дерево относительно множеств. –