
#include <algorithm>
#include <vector>
#include <iostream>

double dot(const std::vector<double>& p, const std::vector<double>& q)
{
    return std::inner_product(p.begin(), p.end(), q.begin(), 0);
}

template<std::size_t N>
double dot(const double (&p)[N], const double (&q)[N])
{
    return std::inner_product(p, p+N, q, 0);
}

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

    std::cout << dot(v1, v2) << '\n';

    double p[3] = {1,2,3};
    double q[3] = {2,2,2};

    std::cout << dot(p, q) << '\n';
}
