Нужно сделать приблизительно такое:
for(Matrix::iterator row = matrix.begin(); row != matrix.end(); row++)
for(Matrix::Row::iterator col = row->begin(); col != row->end(); col++)
myStream << *col;
Развесисто и непереиспользуемо (нужно всегда копировать эти строки,
если хочется сделать что-нибудь другое с элементами матрицы.
Сильно подозреваю, что где-то рядом кроется изящный приём типа
boost::bind, позволивший бы сделать это одним махом, без итераторов
и циклов.
Например, такое приходит в голову:
std::for_each(
matrix.begin(),
matrix.end(),
boost::bind(
&std::for_each,
_1.begin(),
_2.end,
some_operator
)
);
Ясно, что работать оно не будет, ибо в boost::arg<> нет никаких
begin() и end().
Или такое:
std::for_each(
matrix.begin(),
matrix.end(),
boost::bind(
&std::for_each,
boost::bind(&Matrix::Row::begin, _1),
boost::bind(&Matrix::Row::end, _2),
some_operator
)
);
Тоже не годится, потому что два промежуточных параметра внешнего
bind должны быть определены объектом типа boost::arg<>.
Вот что бы такое придумать, чтобы было столь же красиво и работало? :)
Если это действительно матрица, а не последовательность чисел,
то внутри some_operator могут понадобиться
row - matrix.begin()
и
col - row.begin()
Если же хочется рассматривать матрицу просто как упорядоченную
последовательность чисел, то можно сделать итераторы, которые будут
перебирать все элементы по строкам, по столбцам и т.п.