[英]how elements are stored in list of STL in C++
我正在閱讀有關C ++標准模板庫中的列表的信息。 我讀取了無法使用索引訪問的元素。 誰能讓我知道列表如何存儲在內存中? 它是順序的嗎? 我知道鏈接列表是如何實現的。 STL中的列表是否也以相同的方式實現? 即一個指針將具有下一個元素的地址?
如果是這樣,迭代器的增量如何能夠指向列表中的下一個元素? 迭代器上的增量運算符是否過載?
std::list<>
是序列容器, std::vector<>
std::deque
。 它們的實現方式取決於實現方式。 但是它們的行為和所需的特性由標准定義。
例如,列表必須具有固定時間插入。 一種載體, 不需要恆定的時間插入但具有其它要求(如常量時間隨機訪問)。 這樣的要求使實現傾向於通用算法(例如, std::list
list在傳統意義上通常是一個雙鏈表)。
通過將容器狀態附加到迭代器,迭代器可以在諸如std::list<>
的容器上“工作”。 例如,列表迭代器可以通過指向底層實現中當前節點的指針來知道其迭代容器及其在序列枚舉中的“位置”。 推進迭代器只是意味着讓它在內部節點指針中移動到該指針的“下一個”。
不要在強制性行為下的實現中賦予過多含義。 只要滿足了行為要求,從根本上說,底層實現就可以是任何東西 。
std::list
通常實現為鏈接列表,每個節點都存儲一個列表元素以及指向上一個和下一個節點的指針。 通常在鏈表的開頭和結尾都使用帶有虛假節點的鏈表來實現(這使實現更加簡單和美觀)。 在gcc實現中,它們僅使用一個節點作為起始和結束偽節點,因此該列表實際上是循環的。 該偽節點不包含任何列表元素(如果包含該列表元素,則由於許多原因會造成問題)。 該節點具有非模板類型(讓我們說basic_node
),如下所示:
struct basic_node
{
basic_node * prev, * next;
};
其他包含值的節點被模板化:
template <typename T>
struct node : basic_node
{
T value;
};
std::list::iterator
存儲指向basic_node
的指針。 這具有以下優點:迭代器的大多數代碼獨立於template參數。 例如,要增加迭代器,我們可以做類似node_ptr = node_ptr->next;
,其中node_ptr
類型為basic_node
。
取消引用時, std::list<T>::iterator
可以將指向節點的指針return static_cast<node<T> *>(node_ptr)->value;
為適當的模板化節點: return static_cast<node<T> *>(node_ptr)->value;
。
列表沒有順序存儲。 如果您要的是您正在尋找std::vector
。
在文檔中 ,“列表是序列容器,允許在序列中的任何位置進行恆定時間的插入和擦除操作,並且可以雙向迭代。列表容器被實現為雙向鏈接的列表”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.