как пройти через boost::multi_array

Я просматривал библиотеку boost::multi_array в поисках итератора, который позволит вам пройти весь multi_array за один цикл for.

Я не думаю, что в этой библиотеке есть такой итератор. (Найденные там итераторы позволяют пройти одно измерение массива multi_array)

Я ошибаюсь?
Если нет, то есть ли какая-нибудь библиотека, которая определяет такой итератор?

Вводя подробности, я хотел бы написать что-то вроде:

boost::multi_array< double, 3 > ma(boost::extents[3][4][2]);  

for( my_iterator it = ma.begin(); it != ma.end(); ++it )  
{  
    // do something  
    // here *it has element type (in this case double)  
}  

и получить цикл, который повторяется 3x4x2 раза


person Jon Snow    schedule 06.04.2011    source источник


Ответы (1)


Вы можете использовать реализацию std::for_each из <algorithm> для доступа к каждому отдельному элементу. Пример приведен в документации по Boost.

В качестве альтернативы вы можете использовать array::origin() и array::num_elements() следующим образом:

boost::multi_array< double, 3 > ma(boost::extents[3][4][2]);  

for(auto i = ma.origin(); i < (ma.origin() + ma.num_elements()); ++i)  
{  
    // do something with i
}  
person Maarten    schedule 06.04.2011
comment
Я считаю, что вам нужен ma.data(), а не ma.origin() для конкретных классов boost::multi_array и boost::multi_array_ref. origin() будет делать неверные действия для ненулевых index_bases(), в то время как data() будет работать правильно. - person Rhys Ulerich; 13.04.2011
comment
@Maarten Этот пример в ссылке показывает boost:: for_each (не std:: for_each), который ожидает итератор диапазона, верно (в отличие от начала и конца в стандартной версии)? multi_array, похоже, не предоставил ни одного из них (.begin/end() или автоматического итератора диапазона) в моем эксперименте. - person David Doria; 23.02.2016