В чем преимущество мультикарты над картой векторов? - PullRequest
62 голосов
/ 14 декабря 2010

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

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

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

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

Ответы [ 2 ]

49 голосов
/ 14 декабря 2010

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

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

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

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

48 голосов
/ 14 декабря 2010

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

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

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

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

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

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

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

...