Сложность функции 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. Но я думаю, что его сложность постоянна в общем количестве элементов в массиве.

Другие вопросы по тегам