Как в коде статичные массивы заменить на вектора?

Создайте шаблон функции scalar_product(), рассчитывающей скалярное произведение двух векторов в пространстве размерности n. В качестве параметров шаблона используйте тип элементов вектора T и его размер n. Продемонстрируйте работу шаблона для векторов с различными типами элементов и размерами.

Есть код, как в нём статичные массивы заменить на вектора?

Код прилагается:

#include <iomanip>
#include <iostream>
#include <ctime>
#include <vector>
using namespace std;


template<class Type>

Type ScalarProduct(Type v1[],Type v2[],int n)
{
    int i = 0;
    Type sum=0;
    for (i=0; i < n; i++)
        sum += v1[i] * v2[i];
    return sum;
}




int main()
{

    int n;
   double vect1[] = { 1.0,2.1,3.2 }, vect2[] = { 3.1,2.2,1.0 };  // (1.0*3.1)+(2.1*2.2)+(3.2*1.0)=10.92
    int vect3[]={1,2,3,4}, vect4[]={3,2,1,4 };  // рез-тат=26
  //float vect5[] = {1.1,2.1,3.2 }, vect6[] = { 3.1,2.2,1.0 };

    cout << ScalarProduct <double>(vect1,vect2,3) << "\n";
    cout << ScalarProduct <int>(vect3,vect4,4)<<"\n";
    // cout << ScalarProduct <float>(vect5,vect6,3) << "\n";
    cin.get();
    return 0;
}

Ответы (1 шт):

Автор решения: AR Hovsepyan

Если в параметрах шаблона функции указывается размер, и если речь идет об std::vector(странное требование), то вот вариант:

/*очередность параметров шаблона специально
 выбрано так, чтобы второй параметр выводился из 
 типа инстанцирования аргумента */
template<size_t n, typename Type>
Type
ScalarProduct(std::vector<Type>& v1, std::vector<Type>& v2)
{
    if (v1.size() != n)
        v1.resize(n);
    if (v2.size() != n)
        v2.resize(n);
    return //я просто использую стандартный алгоритм
    std::inner_product(v1.begin(), v1.end(), v2.begin(), Type());
}

 
std::vector<int> 
v1{ 2, 3, 4,  7, 45, 2 },
v2{ 3, 4, 5 };   
cout << ScalarProduct<4>(v1, v2) << '\n'
     << ScalarProduct<2>(v1, v2);

тип элемента может быть любым, имеющий оператор '*', и ՛+'

→ Ссылка