Ответ на этот вопрос затруднен из-за того, что программисты видели термины, имеющие более конкретные значения в определенных языках или системах, которые они использовали, но вопрос требует независимого от языка сравнения «в теории», которое я имею в виду в терминах Computing Science ,
Терминология объяснила
Словарь Оксфордского университета по информатике перечисляет:
словарь - любая структура данных, представляющая набор элементов, которые могут поддерживать вставку и удаление элементов, а также проверку на членство
- Например, у нас есть набор элементов {A, B, C, D ...}, которые мы смогли вставить и могли начать удаление, и мы можем запросить «присутствует C?» ,
Понятие Computing Science of map, хотя и основано на математическом лингвистическом отображении терминов , которое Оксфордский словарь определяет как:
Отображение Операция, которая связывает каждый элемент данного набора (домена) с одним или несколькими элементами второго набора (диапазона).
- Таким образом, структура данных карты обеспечивает способ перехода от элементов данного набора - известных « ключей » на карте к одному или нескольким элементам во втором наборе - известных как связанные « значения ».
- В «... или более элементов , во втором наборе» аспект может быть поддержан реализации является два различных способа:
- Многие реализации карт обеспечивают уникальность ключей и позволяют каждому ключу быть связанным только с одним значением, но это значение может быть самой структурой данных, содержащей много значений более простого типа данных, например {{1, {"one" , "ichi"}, {2, {"two", "ni"}}} иллюстрирует значения, состоящие из пар строк.
- Другие реализации карты допускают дублирование ключей, каждое сопоставление с одинаковыми или разными значениями, что функционально удовлетворяет случаю «ассоциирует ... каждый элемент [ключ] ... с ... более [чем один] [элемент] значения»). Например, {{1, "one"}, {1, "ichi"}, {2, "two"}, {2, "ni"}}.
Словарь и карта противопоставлены
Таким образом, используя строгую терминологию Comp Sci, приведенную выше, словарь - это только карта, если интерфейс поддерживает дополнительные операции, которые не требуются для каждого словаря:
возможность хранить элементы с различными компонентами ключа и значения
возможность получить значение (я), заданное только ключом
Тривиальный поворот:
- интерфейс карты может не поддерживать напрямую проверку того, находится ли пара {ключ, значение} в контейнере, что педантично является требованием словаря, в котором элементы оказываются парами {ключ, значение}; карта может даже не иметь функции для проверки ключа, но в худшем случае вы можете увидеть, если попытка поиска значения по ключу удалась или не удалась, тогда, если вам интересно, вы можете проверить, извлек ли ключ ожидаемое значение.
Общайтесь однозначно с вашей аудиторией
⚠ Несмотря на все вышеперечисленное, если вы используете словарь в строгом понимании Computing Science, описанном выше, не ожидайте, что ваша аудитория будет следовать за вами изначально, или не будете впечатлены, когда вы будете делиться и защищать терминологию. Другие ответы на этот вопрос (и их возражения) показывают, насколько вероятно, что «словарь» будет синонимом «карты» в опыте большинства программистов. Попробуйте выбрать терминологию, которая будет более широко и однозначно понятна: например,
- Ассоциативный контейнер : любой контейнер, хранящий пары ключ / значение с извлечением и удалением значения по ключу
- карта хеша : реализация хеш-таблицы ассоциированного контейнера
- хэш-набор, обеспечивающий применение уникальных ключей реализующий : реализация хеш-таблицы для словаря, хранящего элемент / значения, без обработки их как содержащих различные компоненты ключ / значение, в которых дубликаты элементов не могут быть вставлены
- Карта двоичного дерева баланса с поддержкой дубликата ключа : ...
Перекрестная ссылка на терминологию Comp Sci с конкретными реализациями
Стандартная библиотека C ++
- карты:
map
, multimap
, unordered_map
,unordered_multimap
- другие словари:
set
,multiset
, unordered_set
,unordered_multiset
- Примечание: с итераторами или
std::find
вы можете удалить элемент и тест на членство в array
, vector
,list
, и deque
т.д., но контейнере интерфейсы напрямую не поддерживают , что из - за нахождения элемента эффектно неэффективно в O (N), в некоторых случаях вставки / стирании неэффективно, и поддержка этих операций подрывает намеренно ограниченный API, который подразумевает контейнер - например, deque
s должен поддерживать только стирание / выталкивание спереди и сзади, а не с точки зрения некоторого ключа. Необходимость выполнять больше работы в коде для организации поиска мягко побуждает программиста переключаться на структуру данных контейнера с более эффективным поиском.
... может позже добавить другие языки / не стесняйтесь редактировать в ...