2

As withのコンテナがあります

struct A { int f(); }

コンテナーは反復子を提供し、この例ではそれが std::vector であると想定できます。そう:

std::vector<A> As;

ここで、A::f によって提供される値を 2 番目のコンテナーにコピーします。

std::vector<int> fs;

単純に反復することもできましたが、演習として、ブーストバインド/ブーストイテレータでこれを解決しようとしました。これまでに試したことは次のとおりです。

std::copy(
     boost::make_transform_iterator
         (As.begin(), boost::bind(&A::f, _1)),
     boost::make_transform_iterator
         (As.begin(), boost::bind(&A::f, _1)),
     std::back_inserter( fs )
);

これを行う方法を知っている人はいますか?

4

2 に答える 2

3

2 番目の make_transform イテレータを begin() ではなく end() を指すように変更すると、すべてが機能するように見えます。

#include <boost/iterator/transform_iterator.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <vector>

struct A {
    int f() {
        static int x = 0;
        return x++;
    };
};

int main() {
    std::vector<A> As;
    As.push_back(A());
    As.push_back(A());
    As.push_back(A());

    std::vector<int> fs;

    std::copy(
            boost::make_transform_iterator(As.begin(), boost::bind(&A::f, _1)),
            boost::make_transform_iterator(As.end(),   boost::bind(&A::f, _1)),
            std::back_inserter(fs)
            );

    for (int const & x : fs)
        std::cout << x << std::endl;
}

出力

0
1
2

代替ソリューション

ファンクターを使用してこれを解決することもできます。

struct Functor {
    int operator()(A & value) const {
        return value.f();
    }
};

std::transform(As.begin(), As.end(), std::back_inserter(fs), Functor());

またはラムダで:

std::transform(As.begin(), As.end(), std::back_inserter(fs), [](A & a) { return a.f(); });
于 2013-03-21T18:42:13.297 に答える
1

渡した関数のようなオブジェクトがmake_transform_iteratorを受け取り、Aそれを呼び出した結果を返すようfにしAます。で行ったようにこれを行うことができますが、 :bindでより明示的に行うことができます。std::mem_fn

std::copy(
  boost::make_transform_iterator
    (As.begin(), std::mem_fn(&A::f)),
  boost::make_transform_iterator
    (As.end(), std::mem_fn(&A::f)),
  std::back_inserter( fs )
);

2番目の変換イテレータは適応する必要があることに注意してくださいAs.end()

于 2013-03-21T18:39:49.897 に答える