我想知道,假设我有一个大对象,例如一个矩阵,并且我想提供某种功能以某种方式修改该对象(在矩阵的情况下,我们可能希望反转矩阵)。

实现反转功能的最佳方法是什么?

我想到了四个选择:

  • 我们可以有一个成员函数Matrix::invert()来对其自身进行反转。
  • 成员函数可以构造一个新的倒置矩阵(类似于std::string::substr)
  • invert可以是采用和修改引用的非成员函数:void invert(matrix& m)
  • invert可以是一个非成员函数,它按值获取矩阵,将其求反,然后返回:matrix invert(matrix m)

  • 现在,第四个选项对我来说似乎是最好的,因为如果用户希望保留原始矩阵,则不会修改原始矩阵:auto m = matrix{};auto m2 = invert(m);
    如果他们只想要倒矩阵,则可以执行以下操作:auto m = matrix{};auto m2 = invert(move(m));要么auto m = invert(matrix{})(这应该是有效的,因为新构造的矩阵将被移入取反,修改,然后rvo'd或移出到m)

    但这违背了将影响类表示的操作实现为成员函数的想法。因此,理想情况下,我想要一种实现成员函数matrix& matrix::invert()的方法,该函数会在右值上调用父矩阵时修改父矩阵,但如果在左值上调用父矩阵,则保持原样并返回新矩阵。这是正确的方法吗?以及如何实现?

    另一个选择是实现一个修改原始成员的成员,以及一个非成员,该成员根据参数是右值(在这种情况下将被移动)还是左值(在这种情况下)“做正确的事”将进行复制)。这仍然有两个缺点:
  • 更多代码,因为现在我们有两个反转函数
  • 链接很尴尬,因为我们可能想说m.invert()但不想修改原始矩阵。

  • 示例:https://gist.github.com/mfaizan/6631482

    谢谢!

    最佳答案

    当然这全都取决于,但是同时具有突变 Action 和导致新对象的 Action 通常很有用。例如您的m.invert()方法可以修改矩阵。它可能比创建新矩阵更有效(它可以更改现有值而无需分配内存)。但是,有一种方法可以创建与原始对象断开连接的新对象。

    您会在std::string上看到此模式:

    string orig("abcd");
    orig += "efgh";
    

    这会使orig字符串发生突变,并且很可能能够避免内存重新分配。
    但是,您也可以创建一个新的新字符串:
    string newStr = orig + anotherStr;
    

    关于c++ - 有效地执行修改操作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18906958/

    10-11 00:48