1

オブジェクトへのポインタのコンテナがあります。ポインターは基本クラスであり、階層は仮想関数を実装しますcount()count()コンテナ内の合計を計算したい。

私は現在for_each、ラムダ関数でこれを行っています:

size_t sum = 0;
std::for_each(ptrs_.begin(), ptrs_.end(), [&sum](ptr const *p) {
    expr += p->count();
});
return sum;

boost::bindおよびstd::accumulateまたは他の標準アルゴリズムでこれを再実装するのを手伝ってくれる人はいますか?

4

1 に答える 1

3
auto getcount = std::mem_fun(&Base::count); // nothing to bind, we just need a functor

size_t sum = std::accumulate(
    boost::make_transform_iterator(ptrs_.begin(), getcount),
    boost::make_transform_iterator(ptrs_.end(), getcount),
    (size_t)0
);

が気に入らない場合auto、またはコンパイラが気に入らない可能性が高い場合は、もちろん、それを 2 回貼り付けたり、 の戻り値の型を探したりmem_fun、関数テンプレートを使用してキャプチャしたりできます。

template <typename IT, typename FUNC, typename T>
T transform_accumulate(IT first, IT last, T init, FUNC func) {
    return std::accumulate(
        boost::make_transform_iterator(first, func),
        boost::make_transform_iterator(last, func),
        init
    );
}

次に、次のように呼び出します。

transform_accumulate(ptrs_.begin(), ptrs_.end(), size_t(), std::mem_fun(&Base::count));

代わりに、std::accumulate2 項ファンクターを取る次の形式を使用します。

struct AddCount {
    size_t operator()(size_t result, Base *p) const {
        return result + p->count();
    }
};

size_t sum = std::accumulate(ptrs_.begin(), ptrs_.end(), size_t(), AddCount());

を書く代わりにAddCount、もちろんラムダ式を使用することもできます。の内容も使用して構築できると思いますが<functional>、そうするつもりはありません。

私はこのコードをテストしていないので、エラーの発見を始めましょう!

于 2012-05-31T09:30:01.307 に答える