我有一些代码看起来像
B Convert(const A& a) {
B b;
// implementation omitted.
return b;
}
vector<B> Convert(const vector<A>& to_convert) {
vector<B> ret;
for (const A& a : to_convert) {
ret.push_back(Convert(a));
}
retun ret;
}
我曾尝试使用 lambda 重写它,但代码看起来并没有更简洁或更清晰:
vector<B> Convert(const vector<A>& to_convert) {
vector<B> ret;
std::transform(to_convert.begin(),
to_convert.end(),
std::back_inserter(ret),
[](const A& a) -> B { return Convert(a); });
retun ret;
}
我真正想做的是:
vector<B> Convert(const vector<A>& to_convert) {
return map(to_convert, [](const A& a) -> B { return Convert(a); });
}
其中 map
是一个功能样式的 map 函数,可以实现为:
template<typename T1, typename T2>
vector<T2> map(const vector<T1>& to_convert,
std::function<T2(const T1&)> converter) {
vector<T2> ret;
std::transform(to_convert.begin(),
to_convert.end(),
std::back_inserter(ret),
converter);
retun ret;
}
显然,上面的内容是有限的,因为它只适用于 vector
,理想情况下,人们希望所有容器类型都具有类似的功能。归根结底,上面的代码仍然不比我原来的代码好。
为什么 STL 中没有这样的东西(我能找到)?
最佳答案
你自己说了,这个map
不够通用。 std::transform
另一方面是,代价是更冗长的接口(interface)。另一个原因是 map
与 std::transform
不同,它强制进行新的分配,这并不总是可取的。
关于c++ - 使用 lambda 将一种类型的 vector 映射到另一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30534178/