3

Насколько я могу судить, для чисто функциональных типов последовательностей наивная реализация последовательности приведет к сложности времени O (n) для доступа к элементу, а лучшая реализация (как описано в Chris Okasaki) обладает сложностью O (log n) для последовательности длины n.Какова временная сложность доступа к элементу для boost :: hana :: tuple?

Какова временная сложность доступа к произвольному элементу в boost::hana::tuple с помощью operator[]? Если это не так, как это реализовано?

+0

если, как сказано в документации повышения :: Hana концептуально похож на 'станд :: tuple' это будет O (1) –

+0

Я не понимаю, почему это было бы только O (1) (во время выполнения). –

+0

Время выполнения или время компиляции? –

ответ

2

Сложность выполнения - O (1). В принципе, это так же быстро, как доступ к члену структуры (потому что это по существу то, что есть). Реализация аналогична реализации std::tuple.

Что касается сложности времени компиляции, это также O (1), но вы платите сложность времени выполнения O (n) для создания кортежа в начале. Кроме того, здесь я измеряю сложность времени компиляции с точки зрения количества экземпляров шаблонов, но это очень наивный способ измерения конечного времени компиляции.

Edit: Вот суть того, как работает доступа кортежей:

// Holds an element of the tuple 
template <std::size_t n, typename Xn> 
struct elt { Xn data_; }; 

// Inherits multiply from the holder structs 
template <typename Indices, typename ...Xn> 
struct tuple_impl; 

template <std::size_t ...n, typename ...Xn> 
struct tuple_impl<std::index_sequence<n...>, Xn...> 
    : elt<n, Xn>... 
{ /* ... */ }; 

template <typename ...Xn> 
struct basic_tuple 
    : tuple_impl<std::make_index_sequence<sizeof...(Xn)>, Xn...> 
{ /* ... */ }; 

// When you call get<n>(tuple), your tuple is basically casted to a reference 
// to one of its bases that holds a single element at the right index, and then 
// that element is accessed. 
template <std::size_t n, typename Xn> 
Xn const& get(elt<n, Xn> const& xn) 
{ return xn.data_; } 
+0

Можете ли вы набросать, как O (1) достигается сложность времени компиляции? Я вижу, что для последовательности фиксированной длины вы можете реализовать аксессор для каждого элемента (например, 'get0',' get1', ..., 'getn') для достижения сложности O (1). Но если длина не известна до момента создания экземпляра шаблона, как вы это делаете? – JohnDuck

+0

Очень умный! Эта часть немного сложна, вы можете уточнить? Когда вы звоните, например. 'get <1> (tuple)' компилятор пытается определить, каким может быть второй параметр шаблона, и поскольку 'basic_tuple' только наследует от одного класса типа' elt <1,/* something * /> ', тогда выводится' Xn' быть '/ * something * /'? – JohnDuck

+0

Или это правильно? Во время поиска имени используется соответствующий 'get <1, T>', потому что каждый из базовых классов кортежа добавляется в набор кандидатов. А затем при выводе параметра шаблона можно выбрать только один, поскольку мы явно указали 'n'. – JohnDuck