本來想用一下Qt鏈表類
QLinkedList Class
但是看文檔的時候發現這句話
官方都這樣說了,那只能用std::list,說明如下,轉自(https://blog.csdn.net/CV_Jason/article/details/83037127)
List
List使用一個doubly linked list(雙向串列)管理元素,按慣例,C++標准庫並未明定實現方式,只是遵守list的名稱、限制和規格。List其實相當於數據結構中的雙鏈表。
其中的list類型定義於namespace std 中,是一個class template:
template<
class T,
class Allocator = std::allocator<T>
> class list;
List的元素可以是任何類型T,Allocator用於指定內存模型,默認是C++ 標准庫提供的類型。
List 的能力
List的內部結構與vector和deque完全不同,List對象提供了兩個pointer,分別指向前后元素。因此,List在幾個方面與vector和deuqe不同:
1.List不支持隨機訪問,因此訪問元素的效率較低;
2.任何位置上,執行元素的插入和移除都很快,始終是常量時間內完成,因為無需移動任何元素;
3.安插和刪除的操作不會因此指向其他元素的pointer、reference、iterator失效;
4.List對異常的控制是,要么操作成功,要么什么都不發生。
List 操作
List容器提供的一般STL所具備的通用能力,但相比於vector和deque具有如下不同——
1.由於不支持隨機訪問,所以List沒有at函數和下標操作符;
2.List並未提供容量、空間重新分配等操作的函數,因為沒有必要,每個元素有自己的內存,在元素被刪除前一直有效;
3.List提供不少特殊成員函數,專門用於移動和移除元素,較之同名的STL通用算法,這些函數執行起來更加迅速,因為他們只需要調整幾個pointer即可。
構建、復制和銷毀(Create、Copy and Destroy)
List的構建、復制和銷毀操作,與每一個序列式容器相同——
非更易型操作(Nonmodifying Operation)
List也提供元素比較、查詢大小等操作——
元素訪問(Element Access)
與vector和deque不同,list沒有at和下標運算符,因此只有兩個直接訪問元素的函數。或者使用range-based for循環遍歷所有元素——
賦值(Assignment)
和其他序列式容器一樣,list提供了通用的賦值動作——
迭代器函數(Iterator Function)
運用迭代器訪問list的唯一方法。由於list不支持隨機訪問,這些迭代器只是雙向迭代器,因此所有用到隨機迭代器的算法——特別是排序算法——都不能進行處理list,但好在list提供了sort函數來取而代之。
插入與移除(Inserting and Removing)
list除了提供了通用的元素插入移除操作之外,還增加了適用於list的remove和remove_if算法。
使用lambda語法使用remove_if算法,移除所有的偶數——
list特殊函數
由於list存儲結構的特性,list還提供了STL通用標准之外的特殊函數,這些函數將list的性能發揮得淋漓盡致,熟練使用這些操作將使編程工作變得事半功倍。
下面是關於list排序函數的舉例——
sort按照op函數定義的規則進行從大到小的輸出,下面是一個合並的舉例——
異常處理 (Exception Handling)
所有的STL容器中,list對異常的安全性提供了最佳支持,幾乎有所的操作都是不成功便成仁:要么成功,要么無效。唯一不提供如此保證的是賦值運算和成員函數sort,不過他們也有最基本保證:拋出異常時不會泄漏資源,也不會與容器恆常特性(invariant)發生沖突。
merge、remove、remove_if和unique提供的保證是有前提的,就是元素之間的比較動作不拋出異常。用數據庫的術語來說,只要不調用賦值操作或sort,並保證元素互相比較時不拋出異常,那么list便可說是事物安全(transaction safe)。