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)
【问题讨论】:
尝试对两个不同大小的valarray
s 执行算术运算会表现出未定义的行为。
很好...但我认为保留最大尺寸并将最后一个元素设置为 0 更自然。
@chaosink 重要的是标准说了什么,而不是你想要它说什么。存在此限制的原因可能是性能。
见en.cppreference.com/w/cpp/numeric/valarray/operator_arith3
@bitmask 给我一个修改标准的机会!
【参考方案1】:
operator+()
不会串联两个 std::valarray<float>
对象,
std::valarray<float> v2 = v0 + v1;
这里,由于v1
的大小为1,它会将v1
中的唯一值添加到v0
中的两个元素中,因此大小保持为2。
std::valarray<float> v2 = v1 + v0;
但在这里,v1
的大小为 1,它将第一个元素 3.f 添加到 v1
中的唯一元素,而 v0
的第二个值被忽略。
这是通常发生的情况,但是两个valarray
s 上的二元运算的行为是未定义的。
【讨论】:
以上是关于std::valarray 的添加具有不同的大小和不同的操作数顺序的主要内容,如果未能解决你的问题,请参考以下文章
将 std::vector 分配给 std::valarray
将数据从 std::vector 传递到 std::valarray 的最有效方法