подталкивания-х Function Output Iterator может делать то, что вы хотите:
std::size_t count = 0u;
int arr[]{0, 1, 2, 3};
std::copy(std::begin(arr), std::end(arr),
boost::make_function_output_iterator([&](auto const&) { ++count; }));
assert(count == 4u);
Единственная проблема в том, что вы должны объявить переменную счетчика вне итератора, потому что нет никакого способа, чтобы извлечь хранимую функцию объекта из boost::function_output_iterator
(и также невозможно извлечь значения закрытия из лямбда, даже если вы преодолели это препятствие). Если вы хотите писать однострочные шрифты, вам нужно будет написать класс итератора самостоятельно, но это не очень большой код; например:
class counting_output_iterator {
public:
using iterator_category = std::output_iterator_tag;
using value_type = void;
using difference_type = void;
using pointer = void;
using reference = void;
std::size_t value = 0u;
struct output_proxy {
output_proxy(std::size_t& value) : m_value(value) { }
template<class T> output_proxy& operator=(T const&) {
++m_value;
return *this;
}
std::size_t& m_value;
};
output_proxy operator*() { return output_proxy(value); }
counting_output_iterator& operator++() { return *this; }
counting_output_iterator& operator++(int) { return *this; }
};
Использование:
int arr[]{0, 1, 2, 3};
auto const count = std::copy(std::begin(arr), std::end(arr),
counting_output_iterator{}).value;
assert(count == 4u);
Голосование, чтобы закрыть как запрос ресурсов, но вы можете [ 'повышение :: counting_iterator'] (http://www.boost.org/doc/libs/1_50_0/libs/iterator/doc/counting_iterator. html) – NathanOliver
Ваш вопрос немного неясен: вы хотите знать, сколько элементов будет содержать пересечение двух множеств без вычисления пересечения? – wasthishelpful
@wasthishelpful Да, в моем примере set_difference, но я ищу универсальное решение итератора Ouput для любого такого алгоритма. – T33C