常數順序與線性順序 size()
有別於 std::
容器,並非所有 fbl::
容器都會自動追蹤
容器的特定大小具體來說,關聯容器一律會
追蹤容器中的元素數量,排序的容器則會執行這些動作
預設選項。
為了避免發生任何意外
對容器上的 size()
方法發出非預期的 O(n)
呼叫 (針對
排序的容器不包含 size()
方法。更多內容
嘗試呼叫 size() 會觸發 static_assert
,而且無法
下一步是使用 compile 方法
指定訓練方式,完成模型編譯
相反地,如果序列容器中目前的元素數量有特定數量,
必須是已知資訊,且元素的 O(n)
計數是可接受的
付款,系統可能會改為呼叫 size_slow()
。
另一方面,如果序列容器需要 O(1)
效能,
使用者可使用「尺寸」容器版本在這個例子中,
容器會增加一個 size_t
,並新增/移除元素至
此時容器的流量就會略高
建立所有容器元素已允許撥打 size()
並撥打電話
size_slow()
現在會變成錯誤。
如要指定清單自動追蹤大小,最簡單的方式就是
使用 SizedSinglyLinkedList
或 SizedDoublyLinkedList
範本別名
宣告容器或者,也可以指定範本引數
手動將 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