将 valarray<bool> 转换为 valarray<int>

Posted

技术标签:

【中文标题】将 valarray<bool> 转换为 valarray<int>【英文标题】:Converting valarray<bool> to valarray<int> 【发布时间】:2021-03-17 22:39:31 【问题描述】:

我正在尝试将 valarray&lt;bool&gt; 转换为 0 和 1 的 valarray&lt;int&gt;

我希望这样的事情会起作用(使用一元 + 调用积分提升,就像在单个 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 &lt; 0 ? 1 : 0; 等价于return !(x &lt; 0);return x &gt;= 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')

运算符 += 应用于 std::valarray<int*>