Если у вас есть доступ к C ++ - 11 (Visual Studio 10+, gcc-4.5 +) и вам разрешено использовать его auto
- это настоящий камень:
// get the range of String key
auto range = multimap.equal_range(key1);
auto range2 = multimap.equal_range(key2);
for (auto it = range.first; it != range.second; ++it)
{
...
}
for (auto it2 = range2.first; it2 != range2.second; ++it2)
{
...
}
В любом случае, я бы простопроверить ключи и выполнить второй цикл, только если key2! = key1.Проверка итераторов каждый раз в цикле имеет определенную стоимость.
Std :: set_difference первого диапазона от второго может упростить код.Может быть, std :: set_union объединяет два диапазона и вставляет через набор back_inserter, чтобы вы получили только одну копию?
Некоторые эксперименты могут быть в порядке.Не забудьте указать свое первое предположение в миксе.Возможно, вас удивит скорость.Если диапазоны, как правило, очень длинные и / или операция цикла является дорогостоящей, это может не стоить головной боли дополнительной бухгалтерии.