繁体   English   中英

转换一个std :: vector <boost::optional<double> &gt;到std :: vector <double>

[英]Convert a std::vector<boost::optional<double>> to a std::vector<double>

我有一个std::vector<boost::optional<double>>foo说。 在此特定实例中,我需要一个std::vector<double> ,其中其他向量中的任何“可选”元素都将映射为新元素中的0。

我是否为此缺少一线解决方案?

另一个选择是不满意

std::vector<double> out(foo.size());
for (auto& it : foo){
    out.push_back(it ? *it : 0.0);
}

我欢迎基于std::optional的解决方案,即使我还没有使用该标准。

std::transform解决方案:

std::vector<double> out(foo.size());
std::transform(foo.begin(), foo.end(), out.begin(), [](const auto& opt){ return opt.value_or(0.0); });

编辑:添加了out定义。

这是一种使用所需值构造输出vector的解决方案。 虽然仍然不能被迫上一行。

auto valueOrZero = [](auto opt){ return opt?*opt:0.0; };
std::vector<double> out(boost::make_transform_iterator(std::begin(foo), valueOrZero), boost::make_transform_iterator(std::end(foo), valueOrZero));

不幸的是, boost::transform_iterator要求为最终迭代器指定一元转换函数,您不能只重复lamdba定义,因为它还要求两个迭代器具有完全相同的类型。 这迫使lambda进入自己的行。

我认为有可能编写一个可解决此问题的转换迭代器,但您必须从头开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM