命名空間
變體
動作

std::list

出自 cppreference.com
< cpp‎ | container
 
 
 
 
定義於標頭檔 <list>
template<

    class T,
    class Allocator = std::allocator<T>

> class list;
(1)
namespace pmr {

    template< class T >
    using list = std::list<T, std::pmr::polymorphic_allocator<T>>;

}
(2) (自 C++17 起)

std::list 是一個容器,支援在容器內任何位置進行常數時間的插入與移除操作。不支援快速隨機存取。它通常被實作為雙向鏈結串列。與 std::forward_list 相比,此容器提供了雙向迭代能力,但空間效率較低。

在 list 內或跨多個 list 增加、移除和移動元素並不會使迭代器或參照失效。只有當對應的元素被刪除時,迭代器才會失效。

std::list 符合 容器 (Container)分配器感知容器 (AllocatorAwareContainer)序列容器 (SequenceContainer)可逆容器 (ReversibleContainer) 的要求。

std::list 的所有成員函式皆為 constexpr:這使得在常數表達式的評估中建立及使用 std::list 物件成為可能。

然而,std::list 物件通常無法成為 constexpr,因為任何動態分配的記憶體都必須在同一個常數表達式的評估中被釋放。

(C++26 起)

目錄

[編輯] 模板參數

T - 元素的型別。
T 必須符合 可複製建構 (CopyConstructible) 的要求。如果 list::operator=list::assign 使用 T 實例化,則 T 必須符合 可複製賦值 (CopyAssignable) 的要求。 (直到 C++11)
對元素施加的要求取決於對容器實際執行的操作。通常要求元素型別為完整型別並滿足 Erasable 的要求,但許多成員函式會施加更嚴格的要求。 (C++11 起)
(直到 C++17)

對元素的要求取決於容器上執行的實際操作。通常要求元素類型符合 可擦除 (Erasable) 的要求,但許多成員函式會施加更嚴格的要求。如果分配器滿足分配器完整性要求,則此容器(非其成員)可以用不完整的元素類型進行實例化。

功能測試巨集 數值 標準 功能
__cpp_lib_incomplete_container_elements 201505L (C++17) 最小不完整類型支援
(自 C++17 起)

[編輯]

配置器 (Allocator) - 用於取得/釋放記憶體以及在該記憶體中建構/銷毀元素的配置器(Allocator)。此型別必須滿足 Allocator 的要求。若 Allocator::value_typeT 不相同,則行為未定義(C++20 前)程式格式錯誤(C++20 起)[編輯]

[編輯] 成員類型

成員型別 定義
value_type T[編輯]
allocator_type Allocator[編輯]
size_type 無號整數型別(通常為 std::size_t[編輯]
difference_type 有號整數型別(通常為 std::ptrdiff_t[編輯]
reference value_type&[編輯]
const_reference const value_type&[編輯]
pointer

Allocator::pointer

(直到 C++11)

std::allocator_traits<Allocator>::pointer

(C++11 起)
[編輯]
const_pointer

Allocator::const_pointer

(直到 C++11)

std::allocator_traits<Allocator>::const_pointer

(C++11 起)
[編輯]
iterator LegacyBidirectionalIterator 以及 ConstexprIterator(C++26 起),指向 value_type[編輯]
const_iterator LegacyBidirectionalIterator 以及 ConstexprIterator(C++26 起),指向 const value_type[編輯]
reverse_iterator std::reverse_iterator<iterator>[編輯]
const_reverse_iterator std::reverse_iterator<const_iterator>[編輯]

[編輯] 成員函式

建構 list
(公開成員函式) [編輯]
解構 list
(公開成員函式) [編輯]
指派值給容器
(公開成員函式) [編輯]
指派值給容器
(公開成員函式) [編輯]
指派數值範圍給容器
(公開成員函式) [編輯]
回傳關聯的配置器
(公開成員函式) [編輯]
元素存取
存取第一個元素
(公開成員函式) [編輯]
存取最後一個元素
(公開成員函式) [編輯]
迭代器
回傳指向起點的反覆器
(公開成員函式) [編輯]
(C++11)
回傳指向終點的反覆器
(公開成員函式) [編輯]
回傳指向起點的反向反覆器
(公開成員函式) [編輯]
(C++11)
回傳指向終點的反向反覆器
(公開成員函式) [編輯]
容量
檢查容器是否為空
(公開成員函式) [編輯]
回傳元素個數
(公開成員函式) [編輯]
回傳最大可能的元素個數
(公開成員函式) [編輯]
修改器
清除內容
(公開成員函式) [編輯]
插入元素
(公開成員函式) [編輯]
插入數值範圍元素
(公開成員函式) [編輯]
(C++11)
原地建構元素
(公開成員函式) [編輯]
刪除元素
(公開成員函式) [編輯]
新增元素到結尾
(公開成員函式) [編輯]
原地建構一個元素到結尾
(公開成員函式) [編輯]
新增數值範圍元素到結尾
(公開成員函式) [編輯]
移除最後一個元素
(公開成員函式) [編輯]
插入元素到開頭
(公開成員函式) [編輯]
原地建構一個元素到開頭
(公開成員函式) [編輯]
新增數值範圍元素到開頭
(公開成員函式) [編輯]
移除第一個元素
(公開成員函式) [編輯]
更改儲存的元素個數
(公開成員函式) [編輯]
交換內容
(公開成員函式) [編輯]
作業 (Operations)
合併兩個已排序的 list
(公開成員函式) [編輯]
從另一個 list 移動元素
(公開成員函式) [編輯]
移除滿足特定條件的元素
(公開成員函式) [編輯]
反轉元素的順序
(公開成員函式) [編輯]
移除連續的重複元素
(公開成員函式) [編輯]
對元素進行排序
(公開成員函式) [編輯]

[編輯] 非成員函式

(於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(自 C++20 起)
按字典序比較兩個 list 的值
(函式模板) [edit]
特化 std::swap 演算法
(函式範本) [編輯]
移除所有符合特定條件的元素
(函式樣板) [編輯]

推導指引

(自 C++17 起)

[編輯] 附註

功能測試巨集 數值 標準 功能
__cpp_lib_containers_ranges 202202L (C++23) 容器的範圍建構與插入
__cpp_lib_constexpr_containers 202502L (C++26) constexpr std::list

[編輯] 範例

#include <algorithm>
#include <iostream>
#include <list>
 
int main()
{
    // Create a list containing integers
    std::list<int> l = {7, 5, 16, 8};
 
    // Add an integer to the front of the list
    l.push_front(25);
    // Add an integer to the back of the list
    l.push_back(13);
 
    // Insert an integer before 16 by searching
    auto it = std::find(l.begin(), l.end(), 16);
    if (it != l.end())
        l.insert(it, 42);
 
    // Print out the list
    std::cout << "l = { ";
    for (int n : l)
        std::cout << n << ", ";
    std::cout << "};\n";
}

輸出

l = { 25, 7, 5, 42, 16, 8, 13, };

[編輯] 缺陷報告

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

DR 應用於 出版時的行為 正確的行為
LWG 230 C++98 T 未被要求為 CopyConstructible
(型別為 T 的元素可能無法被建構)
T 現在也被要求
CopyConstructible
LWG 276 C++98 T 過去總是要求必須是 可複製賦值 (CopyAssignable) 僅在 operator=
assign 使用 T 實例化時才需要

[編輯] 參見

單向鏈結串列
(類別模板) [編輯]
English Deutsch 日本語 中文(简体) 中文(繁體)