如何添加两个多维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
的那个之前。
算法简单明了:
继续将 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
的那个之前。