LINUX.ORG.RU

C++: Использование boost/stl для работы с двумерными векторами


0

0

Нужно сделать приблизительно такое:

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<>.

Вот что бы такое придумать, чтобы было столь же красиво и работало? :)

жениться тебе барин надо

dilmah ★★★★★
()

На С в две строчки. Медитировать на код конечно не получится, да и заказчика в эстетический шок не вгоншиь, но работать будет и очень-очень быстро.

Gharik
()

Если это действительно матрица, а не последовательность чисел, 
то внутри  some_operator могут понадобиться  
  row - matrix.begin()
и 
  col - row.begin()

Если же хочется рассматривать матрицу просто как упорядоченную
последовательность чисел, то можно сделать итераторы, которые будут
перебирать все элементы по строкам, по столбцам  и т.п.

zaregazza
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.