Ники, безусловно, прав насчет вашей опечатки - map2
здесь пусто! Однако нужно быть осторожным с чем-то другим.
Допустим, ваш код выглядел так:
MoneyMap map1;
map1.insert( MoneyPair( 1, mn[1] ) );
map1.insert( MoneyPair( 2, mn[2] ) );
map1.insert( MoneyPair( 3, mn[3] ) ); // (3)
map1.insert( MoneyPair( 4, mn[4] ) ); // (4)
MoneyMap map2;
map2.insert( MoneyPair( 3, mn[4] ) ); // (3)
map2.insert( MoneyPair( 4, mn[3] ) ); // (4)
map2.insert( MoneyPair( 5, mn[6] ) );
map2.insert( MoneyPair( 6, mn[5] ) );
map2.insert( MoneyPair( 7, mn[1] ) );
MoneyMap out;
MoneyMap::iterator out_itr( out.begin() );
set_intersection(map1.begin(), map1.end(),
map2.begin(), map2.end(),
inserter( out, out_itr ) );
Теперь, что случилось бы? Вы обнаружите, что out
будет пустым, потому что set_intersection
использует std::less
для сравнения элементов, а элементы ваших карт являются парами - таким образом (3, mn [3]) отличается от (3, mn [4 ]).
Другой способ сделать это - написать
set_intersection(map1.begin(), map1.end(),
map2.begin(), map2.end(),
inserter( out, out_itr ), map1.value_comp() );
Теперь out
будет содержать два элемента: (3, mn [3]) и (4, mn [4]), потому что их ключи совпадают. Элементы всегда копируются из первого диапазона итератора.
Обратите внимание, что карты всегда сортируются по типу map::value_compare
, который они содержат. Если вы используете необычную функцию сравнения, set_intersection
не будет работать без явно предоставленного функтора сравнения, если элементы карты оказались не в порядке относительно std::less
.