C++已经有许多实现矩阵运算的库,这些库功能齐全,但是有些时候我们可能只需要用到矩阵的加减法等简单的功能,这时候引入这些库显得有些大材小用。这时候,使用STL的vector类并重载operator+来实现矩阵或者向量的加减就十分方便。
但是,我们在处理一维和二维,甚至三维的矩阵时,可能会对不同类型的vector进行重复的重载,这无疑使代码显得有些冗余,而且不易维护。这时,自然想到利用C++的模板来对这一功能进行实现。
#include <iostream>
#include <vector>
#include <exception>
using namespace std;
typedef unsigned int uint;
class different_length : public exception //两相加向量维度不一样的异常
{
private:
string message;
public:
different_length() : message("Different length!") {}
different_length(string str) : message("Error : " + str) {}
~different_length() throw()
{
}
virtual const char *what() const throw()
{
return message.c_str();
}
};
template <typename T>
vector<T> operator+(const vector<T> &a, const vector<T> &b)
{
if (a.size() != b.size())
{
throw different_length();
}
vector<T> re;
for (uint i = 0; i < a.size(); i++)
{
re.push_back(a[i] + b[i]);
}
return re;
}
int main()
{
vector<vector<int>> nums1 = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}};
vector<vector<int>> nums2 = {
{1, 1, 1},
{2, 2, 2},
{3, 3, 3}};
vector<vector<int>> nums3 = nums1 + nums2;
for (uint i = 0; i < nums3.size(); i++)
{
for (uint j = 0; j < nums3[0].size(); j++)
{
cout << nums3[i][j] << " ";
}
cout << endl;
}
return 0;
}
这样,通过一次重载,可以实现不同维度vector的加法运算。
另外需要注意的一点是,假如包含向量与二维矩阵混合的乘法运算,最好统一用二维的vector来表示向量或者矩阵,比如用:
vector<vector<int>> nums = {
{1, 2, 3}};
替代
vector<int> = {1, 2, 3};
这样在写向量或者矩阵的乘除法时,无需对只有一行的向量进行分类讨论。
本文介绍如何利用C++模板重载实现矩阵和向量的加减法,避免了为不同维度的矩阵单独编写重载函数,简化代码且易于维护。通过统一的二维矩阵表示向量,使得混合运算更为简洁。
2295

被折叠的 条评论
为什么被折叠?



