0xb*_*00d 6 c++ iterator stl c++11
我们如何使用std::transform,如果我们不希望每个元素转变成一个变换元素,但2?
以下伪代码说明了我想要实现的目标
std::transform(a.cbegin(), a.cend(), std::back_inserter(b), [](T const& x) {
return f(x) and g(x);
});
Run Code Online (Sandbox Code Playgroud)
当然,我可以调用std::transform两次,但那会很烦人.也许我们需要提供一个自定义插件.还有其他选择吗?
transform仅用于进行一对一的转换.自定义插入器无论如何都不会帮助你,因为transform实现了这样的事情:
while (first1 != last1) {
*d_first++ = unary_op(*first1++); // you have no way to write
// more than one element
}
return d_first;
Run Code Online (Sandbox Code Playgroud)
你实际上必须编写一个自定义迭代器a来迭代每个元素两次,然后在你的仿函数中保持状态,以了解你是处于f状态还是g状态.你可以看到它有多复杂.
除了简单的1-1转换之外的任何东西,你应该只使用一个for循环:
for (const auto& x : a) {
b.push_back(f(x));
b.push_back(g(x));
}
Run Code Online (Sandbox Code Playgroud)
即使是简单的1-1转换,我认为一个简单的range-for表达也会获胜.
您还可以编写自己的transform,需要任意数量的仿函数:
template <typename InIt, typename OutIt, typename... Functors>
void transform(InIt first, InIt last, OutIt d_first, Functors... fs)
{
while (first != last) {
apply(*first, d_first, fs...);
first++;
}
}
Run Code Online (Sandbox Code Playgroud)
用;
template <typename In, typename OutIt>
void apply(const In&, OutIt ) { }
template <typename In, typename OutIt, typename F, typename... Functors>
void apply(const In& in, OutIt& out, F f, Functors... fs)
{
*out++ = f(in);
apply(in, out, fs...);
}
Run Code Online (Sandbox Code Playgroud)
用作(例子):
transform(a.begin(), a.end(), back_inserter(b), f, g);
Run Code Online (Sandbox Code Playgroud)