gpt4 book ai didi

c++ - 为矩阵类重载操作符 >> 时出现问题

转载 作者:太空狗 更新时间:2023-10-29 23:09:23 25 4
gpt4 key购买 nike

我正在尝试通过为矩阵类重载 >> 来学习运算符重载,以通过调用诸如

之类的东西来为矩阵启用基于键盘的输入
Matrix M1;
cin >> M1;

下面给出运算符重载部分

istream &operator>>(istream &in, Matrix &m) 
{
for (int i = 0; i < m.dx; ++i) {
for (int j = 0; j < m.dy; ++j)
in >> m.p[i][j];
}
return in;
}

事实证明我的实现根本不正确。你能告诉我为什么这个实现是错误的吗?

我通过模仿现有的重载实现来实现上述部分>>,它已被证明在矩阵输出部分工作正常,如cout<< A;其中 A 是一个矩阵

ostream &operator<<(ostream &out, const Matrix &m) 
{
for (int i = 0; i < m.dx; ++i) {
for (int j = 0; j < m.dy; ++j)
out << m.p[i][j] << " ";
out << endl;
}
return out;
}

最佳答案

我相信你的问题operator >>是您正在使用 Matrix 中已经存在的任何维度而不是尝试从您找到的输入中恢复维度。

我认为您最好的选择是拥有 operator <<实现在矩阵前面加上维度信息(例如行数和列数),然后有 operator >>函数读取该信息。例如:

ostream &operator<<(ostream &out, const Matrix &m) 
{
out << m.dx << ' ' << out.dy << '\n';
for (int i = 0; i < m.dx; ++i) {
for (int j = 0; j < m.dy; ++j)
out << m.p[i][j] << " ";
out << endl;
}
return out;
}

有了这个,您可以将流提取运算符写成

istream &operator>>(istream &in, Matrix &m) 
{
in >> m.dx >> m.dy;

/* Some sort of logic to ensure that you've allocated an array large enough to
* hold all the elements ...
*/

for (int i = 0; i < m.dx; ++i) {
for (int j = 0; j < m.dy; ++j)
in >> m.p[i][j];
}
return in;
}

这可能不是最美观的输入和输出运算符,但它们应该可以完成工作。

如果您想让这些运算符更加分类,请考虑使用一些特殊字符来分隔行和列来输出矩阵的元素。例如,您可以尝试输出矩阵

0 1 2
3 4 5
6 7 8

作为

[[0 1 2][3 4 5][6 7 8]]

使用此设置,有关矩阵的大小信息隐含在括号分组的工作方式中。话又说回来,这可能会使读取输入变得有点棘手,因为您无法事先知道矩阵有多大。但总体上选择对自己来说最简单的方法。

仅供引用,您可能不想使用 endl在编写流插入运算符时分隔行。除了写一个换行符,endl刷新缓冲区。如果您的流连接到网络连接,您可能不想在矩阵的新行时继续刷新缓冲区,因为这可能导致大量数据以突发(缓慢)的方式发送,而不是将其分组一次(快速)。

希望这对您有所帮助!

关于c++ - 为矩阵类重载操作符 >> 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5373226/

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