名稱空間
變體
操作

C++ 命名需求: 容器 (Container)

來自 cppreference.com
 
 
C++ 命名要求
基本
型別屬性
全庫範圍




Container(容器)
Container(容器)
容器元素
迭代器 (Iterator)
流 I/O
格式化器
隨機數
併發
範圍 (Ranges)
多維檢視
其他

 

一個 容器 (Container) 是一個用於儲存其他物件並管理其所包含物件所用記憶體的物件。

目錄

[編輯] 要求

給定以下型別和值

型別 定義
T 一個物件型別
C 一個包含型別 T 物件的容器類
定義
u, v 型別 Cconst C 的值
mv 型別 C 的值
cv 型別 const C 的值
lhs, rhs 型別 C 的左值
i, j 型別 C::iteratorconst 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_typeC::iteratorC::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);

前置條件

如果 v 不是型別 C 的右值,則 T 可複製插入到 (CopyInsertable) C 中。

(C++11 起)
線性[1]
後置條件
  • 如果 v 是左值,則 c == vtrue
  • 如果 v 是右值,且 cv 不指向同一物件(C++11 起),則 c 等於此構造前 v 的值。
注意
  1. 如果 v 是型別 C 的右值,且 C 不是 std::arraystd::inplace_vector 的特化,則複雜度為常量。

[編輯] 表示式

表示式 型別 語義  複雜度 
C() C 後置條件  C().empty()true 常量
C(v) C 前置條件

如果 v 不是型別 C 的右值,則 T 可複製插入到 (CopyInsertable) C 中。

(C++11 起)
常量[1]
後置條件
  • 如果 v 是左值,則 C(v) == vtrue
  • 如果 v 是右值,且 C(v)v 不指向同一物件(C++11 起),則 C(v) 等於此構造前 v 的值。
lhs = v C& 後置條件
  • 如果 v 是左值,則 lhs == vtrue
  • 如果 v 是右值,且 lvv 不指向同一物件(C++11 起),則 lhs 等於此賦值前 v 的值。
線性
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 效果 返回
u.size() == v.size() &&
    std::equal(u.begin(),
         u.end(), v.begin())
(C++14 前)
std::equal(u.begin(), u.end(),
           v.begin(), v.end())
(C++14 起)
.
線性[2]
u != v 效果 等價於 !(u == v)
lhs.swap(rhs)

swap(lhs, rhs)

void 效果 交換 lhsrhs 的內容。 常量[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< 對型別 Tconst T 的值定義了全序關係。 線性
效果 返回 std::lexicographical_compare_three_way
    (u.begin(), u.end(),
     v.begin(), v.end(),
     synth-three-way )
[5]
注意
  1. 如果 v 是型別 C 的右值,且 Cstd::arraystd::inplace_vector 的特化,則複雜度為線性。
  2. 如果 u.size() != v.size()true,則複雜度為常量。
  3. 如果 Cstd::arraystd::inplace_vector 的特化,則複雜度為線性。
  4. 元素數量由建構函式、插入和擦除的規則定義。它等於 std::distance(v.begin(), v.end()) 的值。
  5. 如果傳遞給 std::lexicographical_compare_three_way 的迭代器是 ConstexprIterator,則該操作由 constexpr 函式實現。

在表示式 i == j, i != j, i < j, i <= j, i >= j, i > ji - j 中,如果 i 和/或 j 分別被指向同一元素的 C::const_iterator 型別的迭代器替換,則語義保持不變。

[編輯] 容器資料競爭

參見 容器執行緒安全

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 179 C++98 iteratorconst_iterator 型別可能不可比較 要求可比較
LWG 276 C++98 T 被要求 可複製賦值的 (CopyAssignable) T 被要求
CopyConstructible(可複製構造)
LWG 322 C++98 未指定 iteratorconst_iterator 的值型別 指定為 T
LWG 774 C++98 swap(a, b) 沒有要求 已新增
LWG 883 C++98 a.swap(b) 被定義為 swap(a, b)
導致迴圈定義
定義為交換
ab 的值
LWG 1319 C++98 iteratorconst_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++ 文件 關於 容器庫