3

據我所知,對於純功能序列類型,序列的天真實現會導致元素訪問的O(n)時間複雜度,並且更好的實現(如Chris Okasaki所述)享有O(log n)複雜度,對於長度爲n的序列。boost :: hana :: tuple元素訪問的時間複雜度是多少?

使用operator[]訪問boost::hana::tuple中的任意元素的時間複雜度是多少?如果它不是上述兩者,它是如何實現的?

+0

:: tuple'這將是O(1) –

+0

我不明白爲什麼它只是O(1)(在運行時)。 –

+0

運行時間還是編譯時間? –

回答

2

運行時複雜度爲O(1)。基本上,它和訪問一個結構成員一樣快(因爲它基本上就是這樣)。該實現類似於std::tuple。至於編譯時的複雜度,它也是O(1),但你在開始時支付O(n)編譯時複雜度來創建元組。另外,在這裏,我用模板實例的數量來衡量編譯時複雜度,但這是測量最終編譯時間的非常幼稚的方法。

編輯:以下是元組訪問工作的要點:如果在文檔提振,因爲說::花是概念上類似於`STD

// 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'被推導出來成爲'/ *東西* /'? – JohnDuck

+0

或者這是正確的?在名稱查找期間,考慮適當的'get <1, T>',因爲每個元組的基類都被添加到候選集合中。然後在模板參數推導中,只有一個可以被選擇,因爲我們明確指定了'n'。 – JohnDuck

相關問題