Spójrz na kod bardzo, bardzo uważnie:
vector<vector<int>> wynik;
for(int w = 0; w < 5; w++)
for(int k = 0; k < 5; k++) {
int cell = 0;
for(int i = 0; i < 5; i++) {
cell = cell + M[w][k] * A[k][w];
}
// std::clog << "w = " << w << "\tk = " << k << '\n'; // to mój dopisek
wynik.at(w).at(k) = cell; //tutaj wywala błąd
}
return wynik;
Co tu jest nie tak? Obiekt wynik, gdyż jego funkcja składowa (at) rzuca std::out_of_range. Spójrzmy na jego definicję:
vector<vector<int>> wynik;
Co? Wektor jest pusty? Może powinniśmy nadać mu jakiś rozmiar, jeżeli chcemy na nim operować. A tak na poważnie to to powinno rozwiązać sprawę:
vector<vector<int>> wynik(5,vector<int>(5));
#PS Użyj <cstdio>, a nie <stdio.h>.