我想知道,假设我有一个大对象,例如一个矩阵,并且我想提供某种功能以某种方式修改该对象(在矩阵的情况下,我们可能希望反转矩阵)。
实现反转功能的最佳方法是什么?
我想到了四个选择:
std::string::substr
)void invert(matrix& m)
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()
的方法,该函数会在右值上调用父矩阵时修改父矩阵,但如果在左值上调用父矩阵,则保持原样并返回新矩阵。这是正确的方法吗?以及如何实现?另一个选择是实现一个修改原始成员的成员,以及一个非成员,该成员根据参数是右值(在这种情况下将被移动)还是左值(在这种情况下)“做正确的事”将进行复制)。这仍然有两个缺点:
示例: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/