template < class InputIterator, class OutputIterator, class UnaryOperator >
OutputIterator transform ( InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperator op );
op
可以成为会员功能吗?如果是这样,我该怎么称呼它?
答案 0 :(得分:3)
不(嗯,不是直接)。您需要使用旧版std::mem_fun
(以及bind1st
,IIRC)或std::bind
/ boost::bind
。
std::transform(
xs.begin(), xs.end(), ys.begin(),
std::bind(&Class::member, &class_instance)
);
答案 1 :(得分:3)
如果你用lambda包装调用,这很容易做到:
#include <algorithm>
#include <vector>
class C {
public:
int op() const { return 1; }
};
class D {
int op() { return 1; }
void f() {
std::vector<C> xs;
std::vector<int> ys;
std::transform(xs.begin(), xs.end(), ys.begin(),
[](const C& x) { return x.op(); });
std::transform(xs.begin(), xs.end(), ys.begin(),
[this](const C& x) { return this->op(); });
}
};
答案 2 :(得分:1)
您需要一个辅助对象,例如std::less
,但对于一元运算符。
C ++ 11 lambdas让这非常容易:
std::transform(xs.begin(), xs.end(), ys.begin(), [](the_type x){ return -x; });
std::transform(xs.begin(), xs.end(), ys.begin(), [](the_type x){ return !x; });
std::transform(xs.begin(), xs.end(), ys.begin(), [](the_type x){ return ~x; });
或者,使用这些灵活的帮助者:
struct negate
{
template<typename T>
auto operator()(const T& x) const -> decltype(-x) { return -x; }
};
struct invert
{
template<typename T>
auto operator()(const T& x) const -> decltype(!x) { return !x; }
};
struct complement
{
template<typename T>
auto operator()(const T& x) const -> decltype(~x) { return ~x; }
};
std::transform(xs.begin(), xs.end(), ys.begin(), negate());
std::transform(xs.begin(), xs.end(), ys.begin(), invert());
std::transform(xs.begin(), xs.end(), ys.begin(), complement());