在解决与运算符重载有关的问题时,我遇到了一个问题。现在,我将描述问题的具体情况。
该代码包含一个名为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
版本有什么问题。有人可以指出代码中的错误吗?任何帮助表示赞赏。谢谢。
答案 0 :(得分:2)
未定义的行为。元素已保留但未添加到向量中:
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()
。