C++ 包含boost::numeric::ublas::matrix的类的运算符重载<;双倍>;

C++ 包含boost::numeric::ublas::matrix的类的运算符重载<;双倍>;,c++,boost,operator-overloading,ublas,C++,Boost,Operator Overloading,Ublas,我有一个类,其中包含一些boost::numeric::ublas::matrix。我想重载类的运算符(+-*/=),这样我就可以用一条语句处理矩阵集 然而,这似乎需要类的临时实例在不修改原始类的情况下携带值。但是,当我在函数中创建一个新实例并返回它时,这对我来说是有意义的: 警告:返回对局部变量“temp”的引用 我对C++非常陌生,运算符重载的例子似乎都返回新的临时对象。我还希望避免实例化新矩阵时的开销,这会导致我在所有元素上循环。我该怎么做?性能是一个问题。操作员过载的传统方式如下。(我想

我有一个类,其中包含一些boost::numeric::ublas::matrix。我想重载类的运算符(+-*/=),这样我就可以用一条语句处理矩阵集

然而,这似乎需要类的临时实例在不修改原始类的情况下携带值。但是,当我在函数中创建一个新实例并返回它时,这对我来说是有意义的:

警告:返回对局部变量“temp”的引用


<>我对C++非常陌生,运算符重载的例子似乎都返回新的临时对象。我还希望避免实例化新矩阵时的开销,这会导致我在所有元素上循环。我该怎么做?性能是一个问题。

操作员过载的传统方式如下。(我想)

内建操作符定义为成员,例如:

foo& operator+=(const foo& rhs);
foo& operator*=(const foo& rhs);
// etc.
只需在
*此
上执行所需操作:

foo& operator+=(const foo& rhs)
{
    // add elements together

    return *this;
}
然后生成自由函数,并在参数中进行复制:

const foo operator+(foo lhs, const foo& rhs)
{
    return lhs += rhs;
}
返回值为
const
,因为这样做很奇怪:

foo a, b, c;
(a + b) = c;
int a, b, c;
(a + b) = c;
同样,这样做也很奇怪:

foo a, b, c;
(a + b) = c;
int a, b, c;
(a + b) = c;
尽管你会对此有不同的意见。这就是如何重用代码,并自动为您完成副本。非常简洁易读

正如尼尔和我在上面所说的,如果你正在创建新数据,那么在某个时候,数据需要有一个新的位置。尽可能使用变异运算符来避免这种情况,但有些事情根本无法避免


这甚至可能不是问题。如果是,尝试优化内存分配;这些可能是最慢的部分。我不确定,但我认为大多数boost类都允许您指定分配器。boost内存池库在这里可能很有用。

如果您已经在使用boost,我强烈建议您将其与示例一起使用

您将获得以下几个好处:

  • 您只需要重载+=-=/=运算符,并免费获得+/-/运算符
  • 您将获得自由实现的操作符的最佳实现
  • 您将摆脱发布的问题,因为您将实现=版本,这需要更少的设计

  • 你正在创建一个新的矩阵,因此你需要创建一个新的矩阵。这意味着复制您的数据,并对其执行算术运算。您需要返回一个值,而不是一个引用-这真的没有办法。我很高兴我当时问了。谢谢你,谢谢你。到目前为止,我只使用了就地操作符,并仔细地操作了一个临时对象。谢谢,我将在周一对此进行一次尝试!