2

我有一个 As with 的容器

struct A { int f(); }

容器提供了迭代器,我们可以在这个例子中假设它是一个 std::vector。所以:

std::vector<A> As;

现在我想将 A::f 提供的值复制到第二个容器中

std::vector<int> fs;

尽管我可以简单地进行迭代,但作为练习,我尝试使用 boost bind / boost 迭代器来解决这个问题。到目前为止,我尝试的是:

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

如果我将第二个 make_transform 迭代器更改为指向 end() 而不是 begin(),那么一切似乎都正常。

#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());

或使用 lambda:

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获取 anA并返回调用fthat的结果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 )
);

请注意,第二个变换迭代器应该适应As.end()

于 2013-03-21T18:39:49.897 回答