size()' 作業順序

常數順序與線性順序 size()

有別於 std:: 容器,並非所有 fbl:: 容器都會自動追蹤 容器的特定大小具體來說,關聯容器一律會 追蹤容器中的元素數量,排序的容器則會執行這些動作 預設選項。

為了避免發生任何意外 對容器上的 size() 方法發出非預期的 O(n) 呼叫 (針對 排序的容器不包含 size() 方法。更多內容 嘗試呼叫 size() 會觸發 static_assert,而且無法 下一步是使用 compile 方法 指定訓練方式,完成模型編譯

相反地,如果序列容器中目前的元素數量有特定數量, 必須是已知資訊,且元素的 O(n) 計數是可接受的 付款,系統可能會改為呼叫 size_slow()

另一方面,如果序列容器需要 O(1) 效能, 使用者可使用「尺寸」容器版本在這個例子中, 容器會增加一個 size_t,並新增/移除元素至 此時容器的流量就會略高 建立所有容器元素已允許撥打 size() 並撥打電話 size_slow() 現在會變成錯誤。

如要指定清單自動追蹤大小,最簡單的方式就是 使用 SizedSinglyLinkedListSizedDoublyLinkedList 範本別名 宣告容器或者,也可以指定範本引數 手動將 fbl::SizeOrder::Constant 或 fbl::SizeOrder::N 傳送到 輸入適當的位置

所有 fbl:: 容器都支援價格低廉的 O(1) is_empty() 作業 方便您測試容器是否包含任何元素 而不是

// This is a list with an O(n) size_slow method
fbl::SinglyLinkedList<std::unique_ptr<Obj>> my_stack;
if (my_stack.size() > 50) { /* ... */ }       // not allowed. Compile time error
if (my_stack.size_slow() > 50) { /* ... */ }  // allowed.
if (my_stack.is_empty()) { /* ... */ }        // always allowed.

// This is a list with an O(1) size method
fbl::SizedSinglyLinkedList<std::unique_ptr<Obj>> my_sized_stack;
if (my_sized_stack.size() > 50) { /* ... */ }      // allowed.
if (my_sized_stack.size_slow() > 50) { /* ... */ } // not allowed. Compile time error
if (my_sized_stack.is_empty()) { /* ... */ }       // always allowed.

// A more verbose way to say the same thing
fbl::SinglyLinkedList<std::unique_ptr<Obj>,
                      fbl::DefaultObjectTag,
                      fbl::SizeOrder::Constant> another_sized_stack;
if (another_sized_stack.size() > 50) { /* ... */ }      // allowed.
if (another_sized_stack.size_slow() > 50) { /* ... */ } // not allowed. Compile time error
if (another_sized_stack.is_empty()) { /* ... */ }       // always allowed.

// Both of these work as well.
struct Tag1 {};
struct Tag2 {};
fbl::SinglyLinkedList<std::unique_ptr<Obj>, Tag1,
                      fbl::SizeOrder::Constant> t1_sized_stack;
fbl::TaggedSinglyLinkedList<std::unique_ptr<Obj>, Tag2,
                      fbl::SizeOrder::Constant> t2_sized_stack;
if (t1_sized_stack.size() > 50) { /* ... */ }      // allowed.
if (t2_sized_stack.size() > 50) { /* ... */ }      // allowed.
if (t1_sized_stack.size_slow() > 50) { /* ... */ } // not allowed. Compile time error
if (t2_sized_stack.size_slow() > 50) { /* ... */ } // not allowed. Compile time error