Как заставить компилятор понимать выражения в 4 и 6 для x и y как valarray, а не как mask_array?
std::valarray<float> x = {1,2,3,4,22,1}; // 1
std::valarray<float> y = {1,2,3,4,5,6}; // 2
x[y<3.f]=1.f; // 3 - ok
x[y<3.f]*=0.5f; // 4 - error: no match for ‘operator*=’ (operand types are ‘std::mask_array<float>’ and ‘float’)
x[y<3.f]=y[y<3.f]; // 5 - ok
x[y<3.f]=2.f*y[y<3.f]; // 6 - error: no match for ‘operator*’ (operand types are ‘float’ and ‘std::mask_array<float>’)
P.S.
в 4 было задумано все элементы массива x с индексами idx=y<3 умножить на 0.5,
в 6 всем элементам массива х с индексами idx=y<3 присвоить 2*y[idx]
Джоссатис в своей книжке по STL пишет, что классы valarray спроектированы плохо,
люди, которые их делали, давно ушли из проекта.
Поэтому он их в книжке не описывает и не рекомендует их использовать.
Можно посмотреть в первом издании книжки — в сети валяется pdf.
На странице cppstdlib.com есть на английском подробности про valarray.
Слева там меню и там пункт: supplementary chapter.
Открывается pdf, где и описано.
Здравствуйте, LaptevVV, Вы писали:
LVV>На странице cppstdlib.com есть на английском подробности про valarray.
LVV>Слева там меню и там пункт: supplementary chapter.
Спасибо, информации в книгах действительно мало ...
P.S.
С вопросом, решение такое:
std::valarray<float> x = {1,1,1,1};
std::valarray<float> y = {1,2,3,4};
std::valarray<float> ones_likes_y(1.,y.size());
x[y<3.f]*=0.5f*ones_likes_y;