【问题标题】:std::transform on vector of vector向量的向量上的 std::transform
【发布时间】:2016-03-01 12:01:49
【问题描述】:

我想在向量的向量上应用 std::transform。这个转换应该做从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;
});

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

【问题讨论】:

  • @DeepBlackDwarf 不是。 OP想要改变内部和外部向量的类型。
  • @DeepBlackDwarf 也许不是,答案取决于 Told 和 Tnew 是同一类型。
  • 关于ToldTnew,您是否可以利用任何属性?你能提到具体的类型吗?这个例子看起来很理论/学术。如果您能提供完整的代码示例以供进一步研究会很好...
  • Told 是一对点,Tnew 是一个点,但我更喜欢一般的答案。谢谢

标签: c++ c++11 vector


【解决方案1】:

如果定义转换运算符不会有效地破坏您的类设计并可能导致其他地方的错误/问题。一种选择是在 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()); });

Live Demo

【讨论】:

  • 定义隐式转换可能很危险,因为编译器可能会在您最不期望的时候使用它。定义它只是为了缩短我认为边缘犯罪的单一转换例程。
  • @ArneMertz 这显然是基于意见的。 OP 要求提供更清洁的解决方案,就是这样。
  • 这不会使解决方案不正确。我不会投反对票,因为这不是我的口味。答案很有用,我同意你的看法:编辑会让读者知道更有用。因此,您可以单击 edit 并帮助改进答案 - 我认为这样更好。不惩罚、鼓励和帮助才是正确的选择。
  • 抱歉 - 虽然这可能适用于这个特定任务,但这样做会有效地破坏你的类设计并可能在其他地方引起错误/问题。这是错误的解决方案。 (除非这个转换应该首先存在!)
  • 感谢您的出色解决方案。不幸的是,改变设计不是一种选择。
猜你喜欢
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2022-06-22
  • 2021-09-22
  • 1970-01-01
相关资源
最近更新 更多