Вы можете просто написать свой собственный вывод, похожий на OutputIterator, который вы можете передать в std::set_difference
. OutputIterator должен быть разборчивым, назначаемым и инкрементным. Также обратите внимание, что std::set_difference
возвращает OutputIterator, поэтому мы можем воспользоваться этим, сделав его конвертируемым до int
.
Поэтому что-то вроде:
struct CountingIterator
: std::iterator<std::output_iterator_tag, int>
{
template <typename T>
CountingIterator& operator=(T&&) {
++count;
return *this;
}
CountingIterator& operator*() { return *this; }
CountingIterator& operator++() { return *this; }
operator int() { return count; }
int count = 0;
};
Который, при изменении пример std::set_difference
выходов:
int main() {
std::vector<int> v1 {1, 2, 5, 5, 5, 9};
std::vector<int> v2 {2, 5, 7};
int count =
std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(),
CountingIterator());
std::cout << count << std::endl; // prints 4
}
Вы можете создать «CounterIterator». – Jarod42