gpt4 book ai didi

c++ - 有效地实现修改操作?

转载 作者:行者123 更新时间:2023-11-30 02:52:27 27 4
gpt4 key购买 nike

我在想,假设我有一些大对象,比如说一个矩阵,我想提供一些功能来以某种方式修改这个对象(在矩阵的情况下,我们可能希望反转矩阵)。

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

我想到了四个选项:

  1. 我们可以有一个成员函数 Matrix::invert() 来反转自身。
  2. 成员函数可以构造一个新的倒置矩阵(类似std::string::substr)
  3. invert 可以是接受和修改引用的非成员函数:void invert(matrix& m)
  4. invert 可以是一个非成员函数,它按值获取矩阵,反转它,然后返回它:matrix invert(matrix m)

目前,第四个选项对我来说似乎是最好的,因为如果用户希望保留原始矩阵,则原始矩阵不会被修改:
auto m = matrix{};
auto m2 = invert(m);

如果他们只想要倒矩阵,他们可以这样做:
auto m = matrix{};
auto m2 = invert(移动(m));
或者
auto m = invert(matrix{})(这应该是高效的,因为新构造的矩阵将被移入 invert、修改,然后 rvo'd 或移出到 m)

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

另一种选择是实现一个修改原始成员的成员,以及一个“做正确的事情”的非成员,这取决于参数是右值(在这种情况下它将被移动)还是左值(在这种情况下,将制作拷贝)。这仍然有两个缺点:

  1. 更多代码,因为现在我们有两个反转函数
  2. 链接很尴尬,因为我们可能想说 m.invert() 但不想修改原始矩阵。

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

谢谢!

最佳答案

当然,这一切都取决于情况,但同时具有变异操作和产生新对象的操作通常很有用。前任。您的 m.invert() 方法可以就地修改矩阵。它可能比创建新矩阵更有效(它可以更改现有值而无需分配内存)。然而,如果有一种方法可以创建与原始对象断开连接的新对象,那将很有用。

你在 std::string 上看到这个模式:

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

这会改变原始字符串并可能避免内存重新分配。但是,您也可以创建一个全新的字符串:

string newStr = orig + anotherStr;

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com