В чем преимущество multimap над картой векторов?



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




  • используя equal_range в multimap для получения элементов ключа и в карте векторов мы просто используем [] оператор и векторных элементов.

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


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



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

655   3  

3 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.