C++使用模板重载vector的加减法实现矩阵向量加减法

本文介绍如何利用C++模板重载实现矩阵和向量的加减法,避免了为不同维度的矩阵单独编写重载函数,简化代码且易于维护。通过统一的二维矩阵表示向量,使得混合运算更为简洁。

C++已经有许多实现矩阵运算的库,这些库功能齐全,但是有些时候我们可能只需要用到矩阵的加减法等简单的功能,这时候引入这些库显得有些大材小用。这时候,使用STLvector类并重载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};

这样在写向量或者矩阵的乘除法时,无需对只有一行的向量进行分类讨论。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值