2015-05-12 2 views
1

Я хотел бы умножить два вектора (по элементам), сохранить результат, а затем взять сумму. Я знаю функцию из stl-алгоритмаSTL Элемент алгоритма мудрый умножение БЕЗ суммы

std::inner_product(x.begin(), x.end(), y.begin(), 0); 

Это не сохраняет результат продукта. Вы знаете, существует ли такая функция, не делая сумму всех результирующих элементов? Я не мог найти это сам. Мне нужно, чтобы это было супер-оптимизировано для скорости.

ответ

1

Кажется, вы имеете в виду стандартный алгоритм std::transform.

Если вы хотите хранить продукты соответствующих элементов двух векторов в некотором третьем векторе, то вы можете написать как

#include <algorithm> 
#include <iterator> 
#include <vector> 
#include <functional> 

//,,, 

std::vector<int> v1 = { /*...*/ }; 
std::vector<int> v2 = { /*...*/ }; 
std::vector<int> v3; 

v3.reserve(v1.size()); 

std::transform(v1.begin(), v1.end(), v2.begin(), 
       std::back_inserter(v3), 
       std::multiplies<>()); 

Или более полный пример

#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <vector> 
#include <functional> 


int main() 
{ 
    std::vector<int> v1 = { 1, 2, 3 }; 
    std::vector<int> v2 = { 3, 2, 1 }; 
    std::vector<int> v3; 

    v3.reserve(v1.size()); 

    std::transform(v1.begin(), v1.end(), v2.begin(), 
        std::back_inserter(v3), 
        std::multiplies<>()); 

    for (int x : v3) std::cout << x << ' '; 
    std::cout << std::endl; 
} 

Выход программы

3 4 3 

Возможно, было бы лучше использовать тип long long int f или продуктов в приведенном выше примере

#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <vector> 
#include <functional> 


int main() 
{ 
    std::vector<int> v1 = { 1, 2, 3 }; 
    std::vector<int> v2 = { 3, 2, 1 }; 
    std::vector<long long int> v3; 

    v3.reserve(v1.size()); 

    std::transform(v1.begin(), v1.end(), v2.begin(), 
        std::back_inserter(v3), 
        std::multiplies<long long int>()); 

    for (int x : v3) std::cout << x << ' '; 
    std::cout << std::endl; 
} 
+0

Как трансформация делает это (поэтапно)? –

+0

@TheQuantumPhysicist Разве вы не видите дубликат? – juanchopanza

+0

@ The Quantum Physicist Просмотреть обновленное сообщение. –

Смежные вопросы