Пока вы можете хранить одно значение в одном месте. Если вы хотите сохранить несколько ненулевых записей в матрице, вам потребуется больше пар пар в более крупной структуре.
map<pair<int, int>, int>
будет следующим логическим шагом. Теперь вы можете выполнять итерацию по строкам, поскольку координата first
является более значимой в порядке сортировки map
.
Чтобы перебрать столбцы, измените этот приоритет:
typedef pair<int, int> mx_coord;
struct reverse_compare {
bool operator() (mx_coord const &l, mx_coord const &r) const
{ return l.second < r.second? true :
r.second < l.second? false : l.first < r.first; }
};
typedef map< mx_coord, int > matrix;
typedef map< mx_coord, int, reverse_compare > matrix_transpose;
Чтобы умножить A на B, транспонировать B и выполнить итерации по A и B, умножая любые элементы, чьи менее значимые координаты совпадают, поскольку упорядочение, естественно, позволяет переходить по строкам и столбцам за столбцами.
Для транспонирования B:
matrix_transpose b_t( b.begin(), b.end() ); // complexity: n log n