Проблема с использованием std :: transform в C ++ - PullRequest
0 голосов
/ 04 марта 2019

Решая вопрос, связанный с перегрузкой оператора, я столкнулся с проблемой.Теперь я опишу специфику проблемы.

Код содержит класс с именем 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 голосов
/ 04 марта 2019

Неопределенное поведение.Элементы зарезервированы, но не добавлены к вектору:

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() вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...