Funkcja o nagłówku vector

0

Cześć, możliwe jest stworzenie funkcji o nagłówku vector, która będzie przyjmować dwa inne vectory. Dokładniej chodzi mi o to, żeby ta funkcja zwracała vector będący sumą wektorów x i y tzn. suma.at(0) = x.at(0) + y.at(0)

vector <int> suma (vector<int> x, vector<int> y) {
	}
2
vector <int> suma (vector<int> x, vector<int> y)
{
    size_t size=x.size();
    if(size!=y.size()) throw exception("WTF?");
    vector <int> ret(size);
    for(int i=0;i<size;++i) ret[i]=x[i]+y[i];
    return ret;
}

.

Lub:

vector <int> suma (vector<int> x, vector<int> y)
{
    size_t size=x.size();
    if(size!=y.size()) throw exception("WTF?");
    vector <int> ret(x);
    for(int i=0;i<size;++i) ret[i]+=y[i];
    return ret;
}

.

Lub:

vector <int> suma (vector<int> x, vector<int> y)
{
    size_t xsize=x.size(),ysize=y.size(),size=max(ysize,xsize);
    vector <int> ret(size,0);
    for(int i=0;i<xsize;++i) ret[i]+=x[i];
    for(int i=0;i<ysize;++i) ret[i]+=y[i];
    return ret;
}
3
template <typename Vec>
Vec suma(const Vec &a, const Vec &b)
{
    Vec res;
    auto out = std::back_inserter(res);

    if (a.size() < b.size()) {
        std::transform(a.begin(), a.end(), b.begin(), out, std::plus<>{});
    } else {
        std::transform(b.begin(), b.end(), a.begin(), out, std::plus<>{});
    }

    return res;
}

Albo

template <typename Vec>
Vec suma(const Vec &a, const Vec &b)
{
    Vec res(std::min(a.size(), b.size()));

    if (a.size() < b.size()) {
        std::transform(a.begin(), a.end(), b.begin(), res.begin(), std::plus<>{});
    } else {
        std::transform(b.begin(), b.end(), a.begin(), res.begin(), std::plus<>{});
    }

    return res;
}

Bez ifów:

template <typename Vec>
Vec suma(const Vec &a, const Vec &b)
{
    auto n = std::min(a.size(), b.size()); 
    Vec res(n);
    std::transform(a.begin(), a.begin() + n, b.begin(), res.begin(), std::plus<>{});
    return res;
}
2
template< typename T >
auto operator+( const vector<T>& a , const vector<T>& b )
{
    vector<T> result(cbegin(size(a)>size(b)?b:a),cend(size(a)>size(b)?b:a));
    transform(begin(result),end(result),begin(size(a)>size(b)?a:b),begin(result),plus<T>{});
    return result;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1