Подтвердить что ты не робот

Почему в стандартной библиотеке C нет хеш-таблиц?

Почему нет поддержки Hashtable в составе стандартной библиотеки C? Есть ли какая-то конкретная причина для этого?

4b9b3361

Ответ 1

В стандартной библиотеке C отсутствует хеш-таблица, потому что либо:

  • никто не представил предложение рабочей группе; или
  • рабочая группа сочла это ненужным.

То, как работает ISO. Предложения выдвигаются, принимаются или отклоняются.

Вы должны быть осторожны с тем, что вы добавляете в стандартную библиотеку, поскольку у вас есть две конфликтующие группы. Как пользователь, вы можете захотеть, чтобы каждая структура данных под солнцем была добавлена ​​к стандарту, чтобы сделать язык более полезным.

Но, как разработчик языка (в стороне, это, вероятно, люди, которые, как правило, составляют большинство различных рабочих групп, поэтому их мнение, вероятно, будет иметь большее влияние), вы действительно не хотите, чтобы чтобы реализовать вещи, которые не могут быть использованы всеми. Все, что было там, когда появился C89, было связано с тем, что основная цель заключалась в том, чтобы кодифицировать существующую практику, а не вводить новые методы. Все итерации стандартов с тех пор были немного свободнее в том, что они могут делать, но обратная совместимость по-прежнему остается важной проблемой.

Сам, у меня также есть конфликты. Мне бы хотелось иметь все возможности библиотек Java, С++ или Python в моем распоряжении в C. Конечно, это сделало бы намного труднее узнать все для новичков и, как заявил один из комментаторов, вероятно, сделать так, чтобы любой код обезьяны может откачивать полезный код, уменьшая мою ценность в процессе: -)

И у меня в значительной степени есть все структуры данных, которые мне когда-либо понадобятся, из моей долгой и (в основном) прославленной карьеры. Вы не ограничены стандартной библиотекой для такого рода вещей. Есть много сторонних инструментов, которые вы можете получить, чтобы выполнить эту работу, и (например, я) вы также можете использовать свои собственные.

Если вы хотите знать, почему определенные решения были приняты на каждой итерации, ISO (и ANSI изначально, до того, как ISO взял на себя), обычно публикуют обоснованные документы. C89 один из ANSI можно найти здесь. Он содержит эту небольшую красоту в области:

В этом Обосновании основное внимание уделяется добавлениям, разъяснениям и изменениям, внесенным в язык, как описано в базовых документах. Это не является основанием для языка С в целом: Комитету было поручено кодифицировать существующий язык, а не разрабатывать новый. В этом Обосновании не предпринимаются попытки защитить ранее существовавший синтаксис языка, такой как синтаксис деклараций или привязка операторов.

Мне особенно нравится признание того, что они не несут ответственности за какой-либо нечестивый беспорядок, который, возможно, предшествовал их попыткам стандартизировать.

Но, возможно, реальный ответ на ваш вопрос лежит в этом бит, одном из руководящих принципов:


Сохраняйте дух C. Комитет сохранил главную цель - сохранить традиционный дух C. Существует множество аспектов духа C, но суть - это чувство сообщества. основополагающие принципы, на которых основан язык C. Некоторые из аспектов духа C можно резюмировать в таких фразах, как:

  • Доверяйте программисту.
  • Не препятствуйте программисту делать то, что нужно сделать.
  • Держите язык небольшим и простым.
  • Предоставьте только один способ выполнить операцию.
  • Сделайте это быстро, даже если он не гарантированно переносится.

Эта третья, вероятно, является основной причиной того, что библиотека не была широко расширена с помощью первоначальной работы по стандартизации - что и тот факт, что такое расширение из комитета, вероятно, привело бы к тому, что ANSI C был помечен C2038, а не C89.

Ответ 2

C сегодня кажется стандартным, поскольку нет никаких полезных структур данных. Никто. Даже строки - и если вы считаете, что строка C - это структура данных, ну, мы должны будем не согласиться с тем, что такое "структура данных".

Если вам нравится C, подумайте об этом как о "чистом слайде"... все ваше приложение составлено из кода, написанного вами и библиотеками, которые вы выбираете, плюс несколько довольно примитивных стандартных библиотечных функций, возможно, одно или два исключения, например qsort. Люди используют C в наши дни для реализации таких вещей, как Python, Ruby, Apache или ядро ​​Linux. Это проекты, которые все равно используют все свои собственные структуры данных, и они вряд ли будут использовать что-то вроде STL.

Многие библиотеки C реализуют общие хэш-таблицы. Есть компромиссы, и вы можете выбрать своего фаворита. Некоторые из них настраиваются с помощью обратных вызовов.

  • Glib имеет объект хеш-таблицы (документация)
  • У Apache Portable Runtime есть хеш-таблица (документация)
  • Библиотека Apple Core Foundation имеет хеш-таблицу (documentation). Примечание. Да, вы можете вставить любой объект в качестве ключа или значения.
  • UTHash - это хэш-таблица (документация)
  • Другая хэш-таблица (ссылка)

Со всеми этими библиотеками, которые делают то, что вы хотите, какая точка добавления хэш-таблицы в стандарт C?

Ответ 3

Стандартная библиотека C не содержит каких-либо крупных устойчивых структур данных - ни списков, ни деревьев, ни стеков, ни хэш-таблиц.

Невозможно дать окончательный ответ, не спрашивая авторов оригинальной библиотеки C. Однако правдоподобное объяснение заключается в том, что реализация таких структур данных включает в себя различные компромиссы, и только автор приложения находится в правильном положении для совершения этих компромиссов.

Обратите внимание, что в стандартной библиотеке COS POSIX задаются общие функции хеш-таблицы: hcreate(), hsearch() и hdestroy(); и обратите внимание также, что их "один размер подходит всем" имеет тенденцию делать их неадекватными для большинства реальных случаев использования, поддерживая приведенный выше аргумент.

Ответ 4

Из-за отсутствия шаблонов

Это предположение, но отсутствие шаблонов на языке, таком как С++, делает внедрение контейнеров очень неэлегантным, так как вам потребуются десятки определений для охвата всех возможных типов, не говоря уже о пользовательских типах.

Есть стратегии C, чтобы смягчить это, как играть с void *, но они теряют проверки типа времени компиляции.

GLib и gnulib - мои рекомендуемые реализации на данный момент: Быстрый способ реализации словаря в C