アルゴリズムの出力要素を数える
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を真似てきちんと作れば、役に立つかもしれません。