c++ - 使用 lambda 将一种类型的 vector 映射到另一种类型

标签 c++ c++11 lambda functional-programming

我有一些代码看起来像

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)。另一个原因是 mapstd::transform 不同,它强制进行新的分配,这并不总是可取的。

关于c++ - 使用 lambda 将一种类型的 vector 映射到另一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30534178/

相关文章:

c++ - g++ 无法推断功能映射实现的模板类型

c# - 太多的函数调用

c++ -/MP 在 VS2012 中不启用 OpenMP 支持

C++ 程序崩溃(数组和 2 指针 binsearch 函数)

c++ - 大括号初始值设定项列表中是否允许显式转换运算符?

c++ - 创建指向模板类的指针

c++ - 两个 [或多个] 具有相同底层数据但数据 View 不同的容器

c++ - 检索特定打印机的可用工作表格式

c++ - 有没有一种方法可以在不创建该类实例的情况下获取 QObject 派生类的类名?

c++ - 生成指向回调函数的常量指针数组