将 valarray<bool> 转换为 valarray<int>
Posted
技术标签:
【中文标题】将 valarray<bool> 转换为 valarray<int>【英文标题】:Converting valarray<bool> to valarray<int> 【发布时间】:2021-03-17 22:39:31 【问题描述】:我正在尝试将 valarray<bool>
转换为 0 和 1 的 valarray<int>
。
我希望这样的事情会起作用(使用一元 +
调用积分提升,就像在单个 bool
上一样):
#include <iostream>
#include <valarray>
int main()
std::valarray<int> xx = 1, 2, 3, 4, 5 ;
std::valarray<int> yy = 5, 4, 3, 2, 1 ;
std::valarray<int> zz = +(xx < yy);
std::cout << zz[0] << std::endl;
return 0;
似乎有些编译器是这样的,但其他编译器则不然。那些不输出类似的东西:
<source>:7:24: error: no viable conversion from '_Expr<_UnClos<std::__unary_plus, std::_Expr, std::__detail::_BinClos<std::__less, _ValArray, _ValArray, int, int>>, std::_Expr<std::__detail::_BinClos<std::__less, _ValArray, _ValArray, int, int>, bool>::value_type>' (aka '_Expr<_UnClos<std::__unary_plus, std::_Expr, std::__detail::_BinClos<std::__less, _ValArray, _ValArray, int, int>>, bool>') to 'std::valarray<int>'
std::valarray<int> zz = +(xx < yy);
^ ~~~~~~~~~~
我可以用“掩码索引”来写:
std::valarray<int> zz = 0 * xx; zz[xx < yy] = 1;
但是这样有点麻烦,我想要一个表达式。
将单个bool
转换为int
很容易,但似乎.apply()
不允许更改内容的类型,所以我不能简单地将这样的转换映射到数组上。
有没有更简单的方法?
【问题讨论】:
【参考方案1】:首先,从 xx 中减去 yy 并让结果 valarray 使用 apply() 以便为每个元素返回 0 或 1:
std::valarray<int> zz = (xx - yy).apply([](int x) return x < 0; );
【讨论】:
整数减法有 UB,所以你不能像那样做一个简单的减法。而return x < 0 ? 1 : 0;
等价于return !(x < 0);
或return x >= 0;
以上是关于将 valarray<bool> 转换为 valarray<int>的主要内容,如果未能解决你的问题,请参考以下文章
测试两个 valarray<double> 是不是相等的最佳方法?
将 std::vector 分配给 std::valarray
C++ - 将 char 引用转换为 bool 引用(std::vector<bool>)
无法将“Published<Bool>.Publisher”类型的值转换为预期的参数类型“Binding<Bool>”
SwiftUI 绑定布尔 if 语句(无法将类型 'Binding<Bool>' 的值转换为预期的条件类型 'Bool')