C++ 向量的向量上的std::变换

C++ 向量的向量上的std::变换,c++,c++11,vector,C++,C++11,Vector,我想在向量的向量上应用std::transform。此转换应执行从std::vector到std::vector的转换 我尝试了以下方法,效果很好: std::vector<std::vector<Told>> source; //fill source std::vector<std::vector<Tnew>> dest; dest.reserve(inliers_pairs.size()); std::transform(begin(sour

我想在向量的向量上应用std::transform。此转换应执行从
std::vector
std::vector
的转换

我尝试了以下方法,效果很好:

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;
});
std::矢量源;
//填充源
std::向量dest;
目的保留(inliers\u pairs.size());
std::transform(开始(源)、结束(源)、std::back_插入器(目标),[](std::vector&item){
std::矢量新_项;
新建_item.reserve(item.size());
std::transform(开始(项目)、结束(项目)、std::back\u插入器(新项目),[](告知和内部项目){
返回从通知中获取新信息(内部项目);
});
返回新项目;
});

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

如果定义转换运算符不能有效地破坏类设计并可能在其他地方导致错误/问题。一个选项是在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()); });
std::矢量源;
std::vector dest(source.size());
std::transform(source.begin()、source.end()、dest.begin(),
[](std::vector const&v){返回std::vector(v.begin(),v.end();});

可能与@DeepBlackDwarf重复,但事实并非如此。OP想要更改内向量和外向量的类型。@DeepBlackDwarf可能没有,答案取决于TELL和Tnew是同一类型。关于
TELL
Tnew
,您可以利用哪些属性?你能提到具体的类型吗?这个例子看起来很有理论性/学术性。若你们能提供完整的代码示例以供进一步研究,那个就太好了……被告知这是一对点,Tnew是一个点,但我更喜欢一般的答案。感谢定义隐式转换可能是危险的,因为编译器可能在您最不希望的时候使用它。定义它只是为了缩短那个单一的变换程序我会考虑边缘罪犯。OP要求一个更干净的解决方案,就是这样。这并不意味着解决方案是错误的。我不会投反对票,因为这不是我的口味。答案是有用的,我同意你的看法:编辑会更有用,让读者知道。因此,您可以点击编辑,帮助改进答案-我认为这样更好。不惩罚、不鼓励、不帮助是最好的方法。对不起,虽然这对这个特殊的任务可能有效,但它可以有效地破坏你的类设计,并可能在其他地方造成bug/问题。这是错误的解决方案。(除非这个转换本来就应该存在!)感谢您提供的好的解决方案。不幸的是,改变设计不是一种选择。