Valarray shares its element

When I divide valarray into my first element, only the first element becomes 1, while others retain their original value.

#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;
}

Actual conclusion:

1 10 15 20 25

Expected Result:

1 2 3 4 5

Why is the actual conclusion not as expected?

I am using g ++ (4.8.1) with -std = C ++ 11

+4
source share
2 answers

Details of why this happens are related to the implementation tricks used in valarrayto improve performance. Both libstdC ++ and libC ++ use expression patterns for the results of operations valarray, and not for immediate operations. This is explicitly permitted by [valarray.syn] p3 in the C ++ standard:

, valarray<T>, , valarray<T> .

, , arr/arr[0] , _Expr<__divide, _Valarray, _Constant, valarray<double>, double>, arr arr[0]. valarray, , ( valarray, , , ).

- , arr, , arr[0], , , arr .

, :

valarray<double> arr{5, 10, 15, 20, 25};
struct DivisionExpr {
  const std::valarray<double>& lhs;
  const double& rhs;
};
DivisionExpr divexpr = { arr, arr[0] };
for (int i = 0; i < size(); ++i)
  arr[i] = divexpr.lhs[i] / divexpr.rhs;

for arr[0] arr[0] / arr[0] i.e. arr[0] = 1, arr[i] = arr[i] / 1, , .

libstd++, double , . , arr[i] / divexpr.rhs arr[i] / 5 arr[i].

+1

:

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

int main() {
    valarray<double> arr({5,10,15,20,25});
    auto v = arr[0];
    arr=arr/v; // or arr/=arr[0];

    for(int value:arr)cout << value << ' ';
    return 0;
}

, (arr[0]) , (arr).
, arr[0], arr[0]/arr[0], ?
, , , ...
, arr/=arr[0] ( , arr[0]/arr[0] , , for - ).
, operator[] std::valarray a T&. : 1 , .
, .

+3

All Articles