Каково преимущество мультимапа по сравнению с картой векторов?

StackOverflow https://stackoverflow.com/questions/4437862

  •  09-10-2019
  •  | 
  •  

Вопрос

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

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

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

Этот вопрос также относится и к неупорядоченному_Мап векторов и Unoromeded_multimap.

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

Также обратите внимание, что map<x, vector<y>> Может иметь пустое значение, установленное с существующим ключом, а Multimap - нет.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top