Предположим, у меня есть два мультимножества. Я хочу удалить все элементы, которые встречаются во втором мультимножестве из первого мультимножества, с учетом количества раз, когда каждый элемент встречается в каждом мультимножестве. Например, если multiset a
содержит 1
пять раз, а multiset b
два раза, когда я вычисляю a -= b
, только два экземпляра 1
должны быть удалены с a
.Как вычислить разницу между двумя мультимножествами?
Вот код, который выполняет эту задачу:
multiset<int> a;
multiset<int> b;
// remove all items that occur in b from a, respecting count ("a -= b")
for (multiset<int>::iterator i = b.begin(); i != b.end(); i++) {
if (a.count(*i) < 1) {
// error
}
// a.erase(*i) would remove ALL elements equal to *i from a, but we
// only want to remove one. a.find(*i) gives an iterator to the first
// occurrence of *i in a.
a.erase(a.find(*i));
}
Конечно есть лучше/идиоматический способ?
Почему вы разыскиваете 'i' после его увеличения? Точно так же итераторы - хорошая причина, чтобы начать привыкать к хорошей практике '++ i'. Еще интересный вопрос. –
Ах, хороший улов - исправлен. – nibot