C++ 命名需求: 容器 (Container)
來自 cppreference.com
一個 容器 (Container) 是一個用於儲存其他物件並管理其所包含物件所用記憶體的物件。
目錄 |
[編輯] 要求
給定以下型別和值
型別 | 定義 |
T
|
一個物件型別 |
C
|
一個包含型別 T 物件的容器類 |
值 | 定義 |
u, v | 型別 C 或 const C 的值 |
mv | 型別 C 的值 |
cv | 型別 const C 的值 |
lhs, rhs | 型別 C 的左值 |
i, j | 型別 C::iterator 或 const C::iterator 的值 |
如果以下型別、語句和表示式是良構的並具有指定語義,則 C
滿足 容器 (Container) 的要求
[編輯] 型別
型別 | 定義 | 要求 |
---|---|---|
typename C::value_type | T
|
T 是 可複製構造的 (CopyConstructible)(C++11 前)可從 C 擦除的 (Erasable)(C++11 起)。 |
typename C::reference | T&
|
無明確要求 |
typename C::const_reference | const T& | |
typename C::iterator | 一個迭代器型別 |
|
typename C::const_iterator | 一個常迭代器型別 | C::const_iterator 是一個 LegacyForwardIterator,其值型別為 T 。 |
typename C::difference_type | 一個有符號整型 | C::difference_type 與 C::iterator 和 C::const_iterator 的差分型別相同。 |
typename C::size_type | 一個無符號整型 | C::size_type 大小足以表示 C::difference_type 的所有非負值。 |
[編輯] 語句
語句 | 語義 | 複雜度 | |||
---|---|---|---|---|---|
C c;
C c = C(); |
後置條件 | c.empty() 為 true。 | 常量 | ||
C c(v);
C c = C(v); |
前置條件 |
|
線性[1] | ||
後置條件 |
| ||||
注意 | |||||
|
[編輯] 表示式
表示式 | 型別 | 語義 | 複雜度 | |||||
---|---|---|---|---|---|---|---|---|
C() | C
|
後置條件 | C().empty() 為 true。 | 常量 | ||||
C(v) | C
|
前置條件 |
|
常量[1] | ||||
後置條件 |
| |||||||
lhs = v | C&
|
後置條件 |
|
線性 | ||||
v.~C() | void | 效果 | 銷燬 v 的所有元素並釋放所有已獲得的記憶體。 | 線性 | ||||
mv.begin() | C::iterator
|
效果 | 返回指向 mv 第一個元素的迭代器。 | 常量 | ||||
cv.begin() | C::const_iterator
|
效果 | 返回指向 cv 第一個元素的迭代器。 | 常量 | ||||
mv.end() | C::iterator
|
效果 | 返回 mv 的尾後迭代器。 | 常量 | ||||
cv.end() | C::const_iterator
|
效果 | 返回 cv 的尾後迭代器。 | 常量 | ||||
v.cbegin() (C++11 起) |
C::const_iterator
|
效果 | 返回 const_cast<const C&>(v).begin()。 | 常量 | ||||
v.cend() (C++11 起) |
C::const_iterator
|
效果 | 返回 const_cast<const C&>(v).end()。 | 常量 | ||||
i <=> j (C++20 起) |
std::strong_ordering | 約束 | 此表示式僅當 C::iterator 滿足隨機訪問迭代器要求時才需要是良構的。 |
常量 | ||||
u == v | bool | 效果 | 返回
|
線性[2] | ||||
u != v | 效果 | 等價於 !(u == v)。 | ||||||
lhs.swap(rhs)
swap(lhs, rhs) |
void | 效果 | 交換 lhs 和 rhs 的內容。 | 常量[3] | ||||
v.size() | C::size_type
|
效果 | 返回 v 的元素數量[4]。 | 常量 | ||||
v.max_size() | C::size_type
|
效果 | 返回型別 C 的最大可能容器的元素數量。 |
常量 | ||||
v.empty() | bool | 效果 | 返回 v.begin() == v.end()。 | 常量 | ||||
可選容器要求 (僅適用於某些型別的容器) | ||||||||
u <=> v (C++20 起) |
synth-three-way-result <C::value_type> |
前置條件 | 要麼 T 建模 three_way_comparable ,要麼 operator< 對型別 T 和 const T 的值定義了全序關係。 |
線性 | ||||
效果 | 返回 std::lexicographical_compare_three_way (u.begin(), u.end(), v.begin(), v.end(), synth-three-way )[5]。 | |||||||
注意 | ||||||||
|
在表示式 i == j, i != j, i < j, i <= j, i >= j, i > j 和 i - j 中,如果 i 和/或 j 分別被指向同一元素的 C::const_iterator
型別的迭代器替換,則語義保持不變。
[編輯] 容器資料競爭
參見 容器執行緒安全。
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 179 | C++98 | iterator 和 const_iterator 型別可能不可比較 |
要求可比較 |
LWG 276 | C++98 | T 被要求 可複製賦值的 (CopyAssignable) |
T 被要求CopyConstructible(可複製構造) |
LWG 322 | C++98 | 未指定 iterator 和 const_iterator 的值型別 |
指定為 T |
LWG 774 | C++98 | 對 swap(a, b) 沒有要求 | 已新增 |
LWG 883 | C++98 | a.swap(b) 被定義為 swap(a, b), 導致迴圈定義 |
定義為交換 a 和 b 的值 |
LWG 1319 | C++98 | iterator 和 const_iterator 可能不具有多趟保證 |
它們被要求滿足 以下要求 LegacyForwardIterator(傳統前向迭代器) |
LWG 2114 (P2167R3) |
C++98 | 允許某些函式的非 bool 返回型別 | 已停用 |
LWG 2182 | C++98 | 由 reference 和const_reference 表示的型別描述不佳 |
改進措辭 |
LWG 2257 | C++98 | 兩個容器比較相等需要線性時間, 即使它們的大小不同 |
在這種情況下僅要求常量 時間 |
LWG 2263 | C++11 | LWG issue 179 的解決方案在 C++11 中被意外刪除 | 恢復 |
LWG 2839 | C++11 | 不允許標準容器的自移動賦值 | 允許但結果 未指定 |
N3346 | C++11 | C::value_type 被要求 可析構的 (Destructible) |
被要求 可從 C 擦除的 (Erasable) |
[編輯] 另請參見
C++ 文件 關於 容器庫
|