Вопрос:
Я пытаюсь выполнить следующую математическую операцию с двумя векторами:
v1 = [a1][a2][a3][a4][a5] v2 = [b1][b2][b3][b4]b5]
Хотите вычислить:
v = [a2*b2][a3*b3][a4*b4][a5*b5]
Обратите внимание, что мне не нужен первый элемент в новом векторе.
Мне было интересно, есть ли более эффективный (однострочный) способ умножить (по элементам) два вектора в С++, чем на for-loop (используя push back). Мой текущий подход таков:
for(long i=1;i < v1.size();++i){ v.push_back(v1[i]*v2[i]); }
Я также пробовал следующее:
for (long i = 1; i < v1.size(); ++i){ v[i-1] = v1[i]*v2[i]; }
Любые предложения?
Лучший ответ:std::transform( v1.begin()+1, v1.end(), v2.begin()+1, v.begin(), // assumes v1,v2 of same size > 1, // v one element smaller std::multiplies<int>() ); // assumes values are ‘int’
Вы можете заменить v.begin() на std::back_inserter(v), если v пуст, вы должны reserve() сохранить память заранее, чтобы избежать множественных распределений.
Ответ №1
Вы можете посмотреть std:: valarray. Он предназначен для математических операций над каждым элементом массива.