【发布时间】:2016-02-25 13:20:42
【问题描述】:
当我将 valarray 除以其第一个元素时,只有第一个元素变为 1,其他元素保持其原始值。
#include <iostream>
#include <valarray>
using namespace std;
int main() {
valarray<double> arr({5,10,15,20,25});
arr=arr/arr[0]; // or arr/=arr[0];
for(int value:arr)cout << value << ' ';
return 0;
}
实际输出为:
1 10 15 20 25
预期的输出是:
1 2 3 4 5
为什么实际输出不如预期?
我使用 g++(4.8.1) 和 -std=c++11
【问题讨论】:
-
似乎
operator/使用了对arr[0]的引用 -
@tobi303 我认为你是对的,operator[] 返回对 arr[0] 的引用,并且引用直接传递给 operator/。谢谢
-
@tobi303 您介意发布答案吗?我觉得你的评论正是我想要的。
-
我会,如果我能理解的话,但是
operator/有签名template <class T> std::valarray<T> operator/ (const std::valarray<T>& lhs, const std::valarray<T>& rhs);(注意常量),因此不应该修改输入,而是创建一个临时存储它的结果(之前退货)。也许是valarray的魔法……你真的和/和/=一样吗?? -
现在我很好奇,一旦有时间我会把它作为一个练习来实现操作符,也许我会得到它。