Сложность функции boost::multi_array reshape()
В чем сложность boost::multi_array
функция reshape()? Я ожидаю, что это будет O(1), но я не могу найти эту информацию в документации. Документация для этой библиотеки на самом деле довольно скудная.
Причина, по которой я спрашиваю, состоит в том, что я хотел бы перебрать объект multi_array, используя один цикл (меня не волнуют индексы массивов). Кажется, что библиотека не обеспечивает способ перебора массива с использованием одного итератора. Итак, в качестве обходного пути, я бы хотел сначала изменить форму массива вдоль одного измерения (с другими измерениями, установленными в 1). Затем я могу перебрать массив, используя один цикл. Тем не менее, я не уверен, насколько эффективно reshape()
операция есть.
Отсюда мой второй вопрос: есть ли простой способ перебрать все элементы multi-array
объект с помощью одного цикла?
1 ответ
Ниже приведена реализация reshape
функция в multi_array_ref.hpp
файл.
template <typename SizeList>
void reshape(const SizeList& extents) {
boost::function_requires<
CollectionConcept<SizeList> >();
BOOST_ASSERT(num_elements_ ==
std::accumulate(extents.begin(),extents.end(),
size_type(1),std::multiplies<size_type>()));
std::copy(extents.begin(),extents.end(),extent_list_.begin());
this->compute_strides(stride_list_,extent_list_,storage_);
origin_offset_ =
this->calculate_origin_offset(stride_list_,extent_list_,
storage_,index_base_list_);
}
Похоже, что функция просто переиндексирует элементы в extents
объект, связанный с размером массива. Функция является линейной по количеству элементов в extends. Но я думаю, что его сложность постоянна в общем количестве элементов в массиве.