[英]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.