Каково преимущество мультимапа по сравнению с картой векторов?
Вопрос
Я не понимаю, почему существует мультимап, если мы можем создать карту векторов или карты наборов. Для меня только различия:
- с использованием
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 - нет.
Это разные вещи, которые ведут себя по -другому.
И, честно говоря, я скучаю по мультимату на некоторых языках, которые не предоставляют его в их библиотеке.