2017-02-06 8 views
2

У меня есть Java-программа, которую я хочу преобразовать в C++. Итак, есть структура данных Linkedhashmap, используемая в Java-коде, и я хочу преобразовать ее в C++. Существует ли эквивалентный тип данных для LinkedHashmap в C++?эквивалент LinkedHashmap в C++?

Я попытался использовать std::unordered_map, однако он не поддерживает порядок вставки.

+0

Нет, у вас его нет. это уродливая структура данных для начала, неудивительно, что никто никогда не предлагал ее стандартизировать –

+0

@DavidHaim hmmm. Итак, как я могу создать хэш-карту с предсказуемым порядком итерации? – emadalamoudi

+2

Вам нужно спросить себя, почему в первую очередь должен был бы порядок ввода в хэш-карте. –

ответ

6

C++ не предлагает шаблон коллекции с поведением, которое воспроизводит Java LinkedHashMap<K,V>, поэтому вам нужно будет поддерживать порядок отдельно от сопоставления.

Это может быть достигнуто путем поддержания данных в std::list<std::pair<K,V>> и сохранять отдельную std::unordered_map<k,std::list::iterator<std::pair<K,V>>> карты для быстрого поиска до пункта по ключевому:

  • При добавлении элемента, добавьте соответствующий ключ/значение пара в конец списка и сопоставить ключ с итератором std::prev(list.end()).
  • При удалении элемента ключом, найдите его итератор, удалите его из списка и удалите отображение.
  • При замене элемента сначала найдите истребитель списка с неупорядоченной картой, а затем замените его содержимое новой парой ключ-значение.
  • При итерировании значений просто итерации std::list<std::pair<K,V>>.
+0

Спасибо, я думаю, что это то, что мне нужно сделать. Это добавит сложности, но, по крайней мере, оно все равно будет выполнять заказ. Еще раз спасибо – emadalamoudi

+0

Поскольку это принятый ответ, я все же считаю необходимым указать, что это хуже, чем LinkedHashMap: 1) Дополнительная косвенность при поиске по ключу 2) Хэш-поиск, необходимый для стирания по-итератору. Интегрированное решение, в котором запись содержит указатели на два связанных списка (порядок вставки и хэш-ведро), не имеет ни одного из этих недостатков. Это имеет значение? Трудно сказать/зависит. Является ли предлагаемое решение * строго * уступающим такому LinkedHashMap? Да. – misberner