Как в коде статичные массивы заменить на вектора?
Создайте шаблон функции 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);
тип элемента может быть любым, имеющий оператор '*', и ՛+'