将 std::vector<boost::optional<double>> 转换为 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 进入自己的行。
我认为可以编写一个解决此问题的转换迭代器,但您必须从头开始。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中