std::valarray 的添加具有不同的大小和不同的操作数顺序

Posted

技术标签:

【中文标题】std::valarray 的添加具有不同的大小和不同的操作数顺序【英文标题】:Add of std::valarray got different sizes with different operand orders 【发布时间】:2020-05-31 02:53:02 【问题描述】:

std::valarray 的添加得到不同的大小和不同的操作数顺序。

代码如下:

#include <iostream>
#include <valarray>
using namespace std;

int main() 
    std::valarray<float> v03.f, 0.f;
    std::valarray<float> v10.f;
    std::valarray<float> v2 = v0 + v1;
    std::valarray<float> v3 = v1 + v0;
    cout << v2.size() << endl; // 2
    cout << v3.size() << endl; // 1

编译器:

g++ (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0
clang version 9.0.0-2~ubuntu18.04.2 (tags/RELEASE_900/final)

【问题讨论】:

尝试对两个不同大小的valarrays 执行算术运算会表现出未定义的行为。 很好...但我认为保留最大尺寸并将最后一个元素设置为 0 更自然。 @chaosink 重要的是标准说了什么,而不是你想要它说什么。存在此限制的原因可能是性能。 见en.cppreference.com/w/cpp/numeric/valarray/operator_arith3 @bitmask 给我一个修改标准的机会! 【参考方案1】:

operator+() 不会串联两个 std::valarray&lt;float&gt; 对象,

std::valarray<float> v2 = v0 + v1;

这里,由于v1 的大小为1,它会将v1 中的唯一值添加到v0 中的两个元素中,因此大小保持为2。

std::valarray<float> v2 = v1 + v0;

但在这里,v1 的大小为 1,它将第一个元素 3.f 添加到 v1 中的唯一元素,而 v0 的第二个值被忽略。 这是通常发生的情况,但是两个valarrays 上的二元运算的行为是未定义的。

【讨论】:

以上是关于std::valarray 的添加具有不同的大小和不同的操作数顺序的主要内容,如果未能解决你的问题,请参考以下文章

将 std::vector 分配给 std::valarray

将数据从 std::vector 传递到 std::valarray 的最有效方法

为啥捕获 lambda 不能应用于 std::valarray?

为啥 std::valarray 不是算术的?

在哪里使用“std::valarray”是个好主意?

正确获取 std::valarray 到(google/quick)工作台