在C ++中使用std :: transform出现问题

时间:2019-03-04 04:16:25

标签: c++ transform

在解决与运算符重载有关的问题时,我遇到了一个问题。现在,我将描述问题的具体情况。

该代码包含一个名为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版本有什么问题。有人可以指出代码中的错误吗?任何帮助表示赞赏。谢谢。

1 个答案:

答案 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()