如何添加两个多维std::vectors(不使用operator+)?

How to Add two multi-dimensional std::vectors (without using operator+)?

算法简单明了:
继续将 n 维向量分解为 n-1 维组成向量,直到您可以访问基本数据类型对象。它们的添加简单且定义明确。

这是我使用模板和 operator+:

的实现
#include <iostream>
#include <vector>

template<class T>
std::vector<T> operator+ (const std::vector<T>& v1, const std::vector<T>& v2)
{
    std::vector<T> output;
    unsigned len = v1.size();
    output.resize(len);
    for (int i = 0; i < len; ++i)
        output[i] = v1[i] + v2[i];
    return output;
}

int main ()
{
    using namespace std;

    vector<std::vector<int>> x = {{8,9,0},{5,6,7}};
    vector<std::vector<int>> y = {{1,1,1},{1,1,1}};

    auto result = x + y; // Yeah, just like that !

    // Being Lazy, instead of implementing multi-dimensional vector printing...
    for (int i = 0; i < result.size(); ++i)
    {
        for (int j=0; j<result[i].size(); ++j)
            cout << result.at(i).at(j) << " ";
        cout << "\n";
    }

    return 0;
}

但是假设你不允许使用operator+
您必须将界面设计为某些函数 Add().

但是我做不到!!这是我的尝试:

#include <iostream>
#include <vector>

// Hoping to handle vectors...
template<class T>
std::vector<T> Add (const std::vector<T>& v1, const std::vector<T>& v2)
{
    std::vector<T> output;
    unsigned len = v1.size();
    output.resize(len);
    for (int i = 0; i < len; ++i)
        output[i] = Add(v1[i], v2[i]);
    return output;
}

// Hoping to handle basic-datatypes...
template<class T>
T Add (const T& v1, const T& v2)
{
    T output;
    unsigned len = v1.size();
    output.resize(len);
    for (int i = 0; i < len; ++i)
        output[i] = v1[i] + v2[i];
    return output;
}

int main ()
{
    using namespace std;

    vector<std::vector<int>> x = {{8,9,0},{5,6,7}};
    vector<std::vector<int>> y = {{1,1,1},{1,1,1}};

    auto result = Add(x, y); // I wish ! But not happening !

    // Being Lazy, instead of implementing multi-dimensional vector printing...
    for (int i = 0; i < result.size(); ++i)
    {
        for (int j=0; j<result[i].size(); ++j)
            cout << result.at(i).at(j) << " ";
        cout << "\n";
    }

    return 0;
}

有可能吗?

您必须为 Add() 提供适用于基本数据类型的版本

// Handle basic-datatypes
template<class T>
T Add(const T& x1, const T& x2)
{
  return x1 + x2;
}

// Specialisation for vectors
template<class T>
std::vector<T> Add(std::vector<T> const& v1, std::vector<T> const& v2)
{
  assert(v1.size()==v2.size());
  std::vector<T> result;
  result.reserve(v1.size());
  for(size_t i=0; i!=v1.size(); ++i)
    result.emplace_back(Add(v1[i],v2[i])); // possibly recursive
  return result;
}

而不是这个:

// Hoping to handle basic-datatypes...
template<class T>
T Add (const T& v1, const T& v2)
{
    T output;
    unsigned len = v1.size();
    output.resize(len);
    for (int i = 0; i < len; ++i)
        output[i] = v1[i] + v2[i];
    return output;
}

必须是:

// Hoping to handle basic-datatypes...
template<class T>
T Add (const T& v1, const T& v2)
{
    return v1 + v2;
}

另外,处理 basic-datatypes 的那个必须在处理 vector 的那个之前。