3

純粋に機能的なシーケンスタイプの場合、単純なシーケンスの実装では要素アクセスのO(n)時間の複雑さが生じ、より良い実装(Chris Okasakiで説明)はO(log n)長さnのシーケンスboost :: hana :: tupleの要素アクセスの複雑さはどのくらいですか?

boost::hana::tupleの任意の要素にアクセスする際の時間の複雑さは、どのようなものですかoperator[]ですか?上記のどちらでもない場合、どのように実装されていますか?

+0

ドキュメントブーストで言ったかのように:: hanaがSTD 'と概念的に類似している::それはO(1) –

+0

だろうtuple'なぜ私はO(1)以外のもの(実行時)になるのか分かりません。 –

+0

実行時間またはコンパイル時間? –

答えて

2

実行時の複雑さはO(1)です。基本的には、構造体メンバにアクセスするのと同じくらい速いです(基本的にそれが何であるかによる)。実装はstd::tupleに似ています。

コンパイル時の複雑さに関しては、それもO(1)ですが、最初にタプルを作成するためにはO(n)のコンパイル時の複雑さを支払う必要があります。また、ここでは、テンプレートのインスタンス化の数に関してコンパイル時の複雑さを測定しますが、これは最終的なコンパイル時間を測定する非常に素朴な方法です。

編集:ここでどのようにタプルアクセス作品の要旨です:

// 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)コンパイル時の複雑さは達成されていますか?固定長シーケンスの場合、O(1)の複雑さを達成するために各要素(たとえば 'get0'、' get1'、...、 'getn')用のアクセサを実装できることがわかります。しかし、長さがテンプレートがインスタンス化されるまで知られていない*場合はどうしますか? – JohnDuck

+0

非常に賢い!この部分は少しトリッキーですが、明確にすることはできますか?あなたが電話すると'<1>(tuple)'コンパイラは2番目のテンプレートパラメータが何であるかを推定しようとします。 'basic_tuple'は' elt <1、/ * something * /> '型の1つのクラスのみを継承し、' Xn'が導かれます'/ * something * /'になる? – JohnDuck

+0

これは正しいですか?名前参照の際には、タプルの基本クラスのそれぞれが候補セットに追加されるため、適切な 'get <1, T>'が考慮されます。そして、テンプレートパラメータの減算中に、明示的に 'n'を指定したので、1つだけを選択することができます。 – JohnDuck

関連する問題