Можем ли мы реализовать функции multimap_intersection или multimap_difference, как мы это делаем для set_intersection и set_difference в STL?

c++
0
Invictus 31 Дек 2011 в 17:00
1
Это теоретический вопрос или вы действительно пытаетесь реализовать что-то подобное? Или вы ищете существующую реализацию?
 – 
Mat
31 Дек 2011 в 17:07
Я видел реализацию в наборе и реализовал ее, но я видел, что в наборе есть встроенные функции для этого, но не в случае мультикарты. Так нам нужно писать это с нашей собственной логикой или что-то подобное уже существует?
 – 
Invictus
31 Дек 2011 в 17:15
Это зависит от семантики, которую вы хотите предоставить. Учитывая наборы {A, A, A, B, C, D} и {A, A, B, B, C, E}, каков будет результат ваших операций?
 – 
David Rodríguez - dribeas
31 Дек 2011 в 17:26
Устанавливает только одно уникальное значение, поэтому мы не можем установить, как вы сказали выше, но в случае карты, поскольку у нас есть ключ и значение, мы можем иметь несколько значений для одного и того же ключа. Поэтому я просто хотел знать, возможно ли это или нет, или кто-то, кто когда-либо реализовывал или использовал подобную вещь в мультикарте или карте?
 – 
Invictus
31 Дек 2011 в 17:28
В моем предыдущем комментарии попробуйте прочитать set как multiset. Мультинаборы позволяют использовать несколько экземпляров ключа так же, как мультимап, и вопрос все тот же: каков будет ожидаемый результат для операций с двумя мультинаборами, как указано выше?
 – 
David Rodríguez - dribeas
31 Дек 2011 в 17:44

1 ответ

Вопрос довольно расплывчатый, и комментарии проясняют некоторые, но не все проблемы. Самый упрощенный ответ заключается в том, что вы можете реализовать (при правильном определении) почти все, и поэтому вы можете реализовать свою версию разности или пересечения для мультикарт. Если вопрос заключается в том, можно ли использовать set_difference непосредственно для ваших целей, ответ будет отрицательным.

Проблема в том, что set_intersection и set_difference реализованы на основе предположения, что диапазоны итераторов отсортированы, что верно для ключей в упорядоченный ассоциативный контейнер (set, map, multiset, multimap), но не для комбинации (ключ, значение), которая, кажется, является тем, что вы хотите получить разницу из.

В качестве обходного пути можно было бы создать функтор, сравнивающий пары типов ключ-значение, и использовать его в качестве порядка для set (не multiset). Затем вы можете вставлять значения в свои мультикарты в наборы и работать с ними. Наконец, выполните операцию в обратном порядке, создав новые мультикарты из набора пересечений/разностей.

1
David Rodríguez - dribeas 31 Дек 2011 в 18:13
Я предполагаю, что предложение реализовать его сначала в наборе и mltimap будет работать ... но это может привести к ненужному увеличению моего LOC, а также мне придется сначала создать набор для заполнения моими значениями, а затем мультикарту, и это может увеличить временную сложность ... Newaz спасибо еще раз за ваш быстрый ответ
 – 
Invictus
31 Дек 2011 в 18:23