アルゴリズムの出力要素を数える
counting_iteratorで思い出した小ネタ。
unique_copy()の出力の要素数を知りたい場合(出力自体には興味がない)、どうするか。
vectorにback_inserterで追加してsize()を調べるのは、明らかに無駄が多いです。
名前からしてcounting_iteratorでできそうな気がして試してみましたが、入力要素(value_type)とカウンタ(difference_type)の間で代入が発生してダメです。
結局その時は、まんまな方法を取りました。
#include <boost/function_output_iterator.hpp>
#include <boost/lambda/lambda.hpp>
#include <algorithm>
#include <iterator>
template <class InputIterator>
inline typename std::iterator_traits<InputIterator>::difference_type
unique_count(InputIterator first, InputIterator last)
{
typename std::iterator_traits<InputIterator>::difference_type n = 0;
std::unique_copy(
first, last,
boost::make_function_output_iterator(++boost::lambda::var(n))
);
return n;
}lambdaのExpression Templateに頼っているせいで、出力反復子をライブラリとして切り出せないのが難点です。counting_iteratorを真似てきちんと作れば、役に立つかもしれません。