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

Какое преимущество мультимапа над отображением векторов?

Я не понимаю, почему multimap существует, если мы можем создать карту векторов или карту множеств. Для меня существуют только отличия:

  • используя equal_range в multimap для получения элементов ключа и в карте векторов, мы просто используем оператор [] и имеем вектор элементов.
  • с помощью multimap.insert(make_pair(key,value)) в multimap для добавления элементов и map_of_vectors[key].push_back(value) в карту векторов.

Так зачем использовать multimap? Для меня лучше иметь вектор, чем два итератора, чтобы получить все значения ключа.

Этот вопрос относится также к unordered_map векторов и unordered_multimap.

4b9b3361

Ответ 1

Я бы сказал, что это зависит от того, имеют ли все значения с одним и тем же ключом отношения, которые вы хотите адресовать.

Так, например, часто ли вы просматриваете все элементы с помощью ключа X или передаете их функции, и так далее? Тогда удобнее уже иметь их в отдельном контейнере, который вы можете адресовать напрямую.

Однако, если у вас есть только набор элементов, которые могут делиться одним и тем же значением ключа, или нет, зачем использовать векторы между ними? Удобнее запускать через multimap с итераторами, чем иметь вложенный цикл для карты, векторный регистр.

Еще один способ взглянуть на это: если несколько записей на ключ очень распространены, ваша структура более эффективна в карте, векторном случае. Если они редко бывают, это наоборот.

Ответ 2

Существует много важных различий между multimap<x, y> и map<x, vector<y>>

После того, как вы вставили значение в multimap, вы знаете, что итератор останется действителен до тех пор, пока вы его не удалите, и это очень сильное свойство, вы не можете иметь его с картой векторов.

multimap<x,y>::iterator p=mymap.insert(make_pair(a,b));

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

Также обратите внимание, что map<x, vector<y>> может иметь пустые значения, установленные с существующим ключом, тогда как multimap не делает.

Это разные вещи, которые ведут себя по-другому.

И, честно говоря, я пропускаю multimap на некоторых языках, которые не предоставляют его в своей библиотеке.

Ответ 3

два итератора??? Я думаю, вы ошибаетесь.

когда я использую std:: for_each() или другое algo из multimap, я использую только ОДИН диапазон итераторов, и это намного проще, чем беспокоиться с вектором для каждого ключа.