在解决与运算符重载相关的问题时,我遇到了一个问题。我现在将描述问题的具体情况。
代码包含一个名为的类Matrix
,定义如下:
class Matrix {
public:
std::vector<std::vector<int>> a;
friend Matrix operator+(const Matrix& x, const Matrix& b);
};
我应该通过重载+
运算符来找到两个矩阵的相加。
最初,我决定使用该transform
函数来执行两个矩阵的相加,并提出了以下代码,该代码不会为所有测试用例生成正确答案,
Matrix operator+(const Matrix& x, const Matrix& y) {
Matrix result;
result.a.reserve(x.a.size());
for (size_t i = 0; i < x.a.size(); i++) {
std::transform(x.a.at(i).begin(), x.a.at(i).end(), y.a.at(i).begin(),
std::back_inserter(result.a[i]), std::plus<int>());
}
return result;
}
因此,我被迫使用嵌套的 for 循环执行相同的任务,这会为所有测试用例生成正确的答案,如下所示:
Matrix operator+(const Matrix& x, const Matrix& y) {
Matrix result;
std::vector<int> vec;
result.a.reserve(x.a.size());
for (size_t i = 0; i < x.a.size(); i++) {
vec.reserve(x.a.at(i).size());
for (size_t j = 0; j < x.a.at(i).size(); j++) {
vec.push_back(x.a.at(i).at(j) + y.a.at(i).at(j));
}
result.a.push_back(vec);
vec.clear();
}
return result;
}
我没有看到transform
版本有什么问题。有人能指出代码中的错误吗?任何帮助表示赞赏。谢谢。
未定义的行为。元素保留但未添加到向量中:
result.a.reserve(x.a.size()); // result.a is still empty
for (size_t i = 0; i < x.a.size(); i++) {
std::transform(x.a.at(i).begin(), x.a.at(i).end(), y.a.at(i).begin(),
std::back_inserter(result.a[i] /* UB */ ), std::plus<int>());
}
result.a.resize()
改为打电话。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句