包含boost :: numeric :: ublas :: matrix <double> </double>的类的运算符重载

时间:2009-12-31 17:31:30

标签: c++ boost operator-overloading ublas

我有一个类,其中包含一些boost :: numeric :: ublas :: matrix。我想重载类的运算符(+ - * / =),以便我可以使用一个语句对矩阵集进行操作。

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

警告:引用本地变量'temp'返回

我对c ++很陌生,运算符重载的例子似乎都返回了新的临时对象。我还想避免实例化新矩阵的开销,这导致我循环遍历所有元素。我该怎么办呢?表现是一个问题。

2 个答案:

答案 0 :(得分:3)

如果您已经使用了强化功能,我强烈建议您使用boost::operators和您的示例。

您将获得以下好处:

  1. 您只需要重载+ = / - = / =运算符,并免费获得+ / - / 运算符。
  2. 您将拥有自由实施的运营商的最佳实施。
  3. 你将摆脱你发布的问题,因为你将实现=版本,这需要较少的设计。

答案 1 :(得分:1)

传统的运算符重载方式如下。 (我认为)

您的就地操作员被定义为成员,例如:

foo& operator+=(const foo& rhs);
foo& operator*=(const foo& rhs);
// etc.

只需在*this上执行所需操作:

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;

虽然你会对此有不同的看法。这是您重用代码的方式,并自动为您完成复制。非常简洁易读。

就像Neil和我上面所说的那样,如果您正在创建新数据,那么在某些时候数据需要有一个新的位置。在可以避免这种情况时使用变异运算符,但有些东西根本无法转义。

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