在C++中将对象添加到 2D 矢量

Adding objects to 2D Vector in C++

本文关键字:2D 矢量 添加 对象 C++      更新时间:2023-10-16

我想使用向量制作一个矩阵,而不是int,我使用类Fraction的对象。

但是,我正在尝试向其添加元素,但到目前为止没有运气。

class Fraction
{
public:
int num;
int den;
friend ostream& operator<< (ostream& os, Fraction& fr);
void operator= (const Fraction& fr);
};
ostream& operator << (ostream& os, Fraction& fr)
{
os << fr.num << "/" << fr.den;
return os;
}
void Fraction::operator=(const Fraction& fr)
{
num = fr.num;
den = fr.den;
}
int main()
{
Fraction fr;
int colunas = 2, linhas = 2;
vector<vector<Fraction>> mat(linhas, vector<Fraction>(colunas));
for (int i = 0; i < colunas; ++i)
{
cout << endl << "Coluna " << i + 1 << endl;
for (int j = 0; j < linhas; ++j)
{
int x;
vector<Fraction> temp;
cin >> x;
fr.num = x;
fr.den = 1;
temp.push_back(fr);
mat.push_back(temp);
}
cout << endl;
}
int len = mat.size();
for (int i = 0; i < len; i++)
{
for (int j = 0; j < mat[i].size(); j++)
{
cout << mat[ i ] [ j ].num << " ";
}
cout << endl;
}
}

有了这个,我确实启动了矩阵,但它只会初始化为行。 它会mat[0][0]mat[1][0],如果我试图访问mat[0][1]它会给我垃圾。

我试过这条线

mat[i][j] = temp;

但它抛出了一个错误:

没有匹配的运算符 =

编辑:遵循建议并相应地更改代码

class Fraction
{
public:
int num;
int den;
friend ostream& operator<< (ostream& os, Fraction& fr);
void operator= (const Fraction& fr);
};
ostream& operator << (ostream& os, Fraction& fr)
{
os << fr.num << "/" << fr.den;
return os;
}
void Fraction::operator=(const Fraction& fr)
{
num = fr.num;
den = fr.den;
}
int main()
{
Fraction fr;
int colunas = 2, linhas = 2;
vector<vector<Fraction>> mat;//(linhas, vector<Fraction>(colunas));
vector<Fraction> temp;
for (int i = 0; i < colunas; ++i)
{
cout << endl << "Coluna " << i + 1 << endl;
for (int j = 0; j < linhas; ++j)
{
int x;
cin >> x;
fr.num = x;
fr.den = 1;
temp.push_back(fr);
}
mat.push_back(temp);
cout << endl;
}
//cout << mat[0][1];
//cin.get();
//cin.get();
int len = mat.size();
for (int i = 0; i < len; i++)
{
for (int j = 0; j < mat[i].size(); j++)
{
cout << mat[ i ] [ j ].num << " ";
}
cout << endl;
}
}

我希望代码执行以下操作:

当我运行它时,这就是它的行为方式

输入

34
3
2
4

输出

34 3
34 3 2 4

然而,这不是我期望的输出,前两个输入数字构成第一列,后两个输入数字构成第二列。所以输出应该是这样的:

预期产出

34 2
3 4

如果我访问mat[0][1]我希望它能给我2/1但它给了我3/1

此行中使用的vector构造函数:

vector<vector<Fraction>> mat(linhas, vector<Fraction>(colunas));

vector<Fraction>(colunas)linhas个副本填充向量,而 本身是许多默认构造的Fractioncolunas的向量。

Faction的默认构造函数是隐式定义的(因为您自己没有声明任何构造函数(,它什么也不做。它使int成员具有不确定的值。

push_back稍后向向量添加新元素,在默认构造的元素中已经存在的元素之后。push_back不会替换矢量中已有的元素。

您可能不想用默认构造的元素预填充向量,因此只需默认初始化mat,这将使它为空。后面的push_back调用将向其添加元素:

vector<vector<Fraction>> mat;

如注释中所述,您无需编写复制赋值运算符。编译器将自动生成一个具有正确行为的编译器。


如果你想避免使用未初始化的值创建Fraction对象,比如你在mat构造函数中所做的那样,那么你可以编写自己的构造函数(这将禁用隐式声明的构造函数(,例如:

class Fraction
{
public:
int num;
int den;
Fraction(int num_, int den_) : num(num_), den(den_) {}
friend ostream& operator<< (ostream& os, Fraction& fr);
void operator= (const Fraction& fr);
};
//...
for (int j = 0; j < linhas; ++j)
{
int x;
vector<Fraction> temp;
cin >> x;
temp.push_back(Fraction(x, 1));
mat.push_back(temp);
}

除了temp.push_back(Fraction(x, 1));,您还可以只写temp.push_back({x, 1});temp.emplace_back(x, 1);.


您可能还打算在内部循环中收集一个内部向量并将其添加到外部向量中,即:

for (int i = 0; i < colunas; ++i)
{
cout << endl << "Coluna " << i + 1 << endl;
vector<Fraction> temp;
for (int j = 0; j < linhas; ++j)
{
int x;
cin >> x;
temp.push_back(Fraction(x,1));
}
mat.push_back(temp);
cout << endl;
}