Хорошо, давайте объясним некоторые понятия, чтобы вы могли понять причину ошибок.
std :: valarray против простого массива c ++ против std :: array
Когда мы говорим о простом c ++массив, мы ссылаемся на что-то вроде следующего:
double myArray[DIM];
- это просто нативная форма массива в c ++. Тогда у нас есть std :: array
std::array<double, DIM> myStdArry;
, это просто класс-оболочка вокруг простого массива c ++ с той разницей, что у вас есть доступ к некоторым служебным функциям для более простого манипулирования данными, например
myStdArry.size() //get the number of elements
myStdArry.begin() & myStdArry.end() //iterators to the begin and end of the array
myStdArry.fill(1.4) //replace all the values of the array to 1.4
Как для обычного, так и для стандартного массива вы должны будете использовать оператор индекса ([]), чтобы получить доступ к каждому элементу массива, т.е.
for (size_t i = 0; i < DIM /*or myStdArry.size()*/; ++i;) {
myArray[i] = ...;
}
//Or with range-based for loop
for (auto& element : myArray) {
element = ...;
}
Из-за этого вы не можете использовать арифметикуоператоры непосредственно на контейнерах (массиве), так как они не перегружены для них. Это когда valarray входит в картину, так как он был специально разработан для такого рода операций. Valarray - это просто еще один тип массива, который перегружает арифметические операторы, применяя их к каждому элементу массива.
т. Е. Давайте предположим, что мы хотели бы возвести в квадрат каждый элемент массива. С массивом plain и std мы могли бы добиться этого, выполнив:
for (auto& element : myStdArray) {
element *= element;
}
Но с помощью valarray мы можем просто сделать:
myValArray *= myValArray;
и мы получим тот же результат.
Другое существенное отличие состоит в том, что хотя обычный массив и массив std имеют фиксированный размер (вы должны установить его размер во время компиляции), массив val может увеличиваться в размерах динамически, и поэтому вам не нужно указывать его размер при объявлении, нодо строительства или позже
myValArray{DIM} //Or
myValArray.resize(DIM)