std::对向量的向量进行变换

std::transform on vector of vector

本文关键字:向量 变换 std      更新时间:2023-10-16

我想对向量的向量应用std::变换。这个转换应该执行从std::vector<std::vector<Told>>std::vector<std::vector<Tnew>>的转换。

我尝试了以下方法,结果成功了:

std::vector<std::vector<Told>> source;
//fill source
std::vector<std::vector<Tnew>> dest;
dest.reserve(inliers_pairs.size());
std::transform(begin(source), end(source), std::back_inserter(dest), [](std::vector<Told>& item){
    std::vector<Tnew> new_item;
    new_item.reserve(item.size());
    std::transform(begin(item), end(item), std::back_inserter(new_item), [](Told& inner_item){
        return get_Tnew_from_Told(inner_item);
    });
    return new_item;
});

有没有一种直接的方法可以在一次转换中做到这一点?更干净的方式?效率更高?

如果定义转换运算符并不能有效地破坏类设计,并可能在其他地方引发错误/问题。一种选择是在Tnew类中定义一个转换构造函数:

class Tnew {
    // ...
  public:
    Tnew() = default;
    Tnew(Told const &tn);
    ^^^^^^^^^^^^^^^^^^^^^
    // ...
};

然后:

  std::vector<std::vector<Told>> source;
  std::vector<std::vector<Tnew>> dest(source.size());
  std::transform(source.begin(), source.end(), dest.begin(), 
    [](std::vector<Told> const &v){ return std::vector<Tnew>(v.begin(), v.end()); });

实时演示