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

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

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

Два итератора??? Я думаю, что вы не правы.

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

Другие вопросы по тегам