系列目錄:走近STL- STL概論node
好,閒話很少說,直接上乾貨。
web
一、你好,List
從實現層面看,相較於Vector的線性空間,List的實現要複雜的多。
List的優點在於每次插入或刪除一個元素,就分配或釋放一個位置。所以,List對於空間的把控有絕對的精準。
並且,對於從任何節點增刪數據,List消耗的永遠是常數時間。安全
List和Vector的使用應該視元素的多寡、元素的構造複雜度、元素的存取頻繁度而定。List優在存取,Vector優在查詢。bash
二、List節點
每個本身寫過鏈表的人都知道,鏈表的節點和鏈表自己是分開設計的。
那咱們來看一下List的節點設計:svg
template <typename T> struct __list_node { typedef void* void_pointer; void_pointer prev; void_pointer neet; T date; }
顯而易見,這是一個通用雙向鏈表的節點(若是對通用鏈表不瞭解,建議必定要本身動手設計一個)。
函數
三、List基本函數使用
- 創
#include<list> typedef struct rect { ··· }Rect; list<Rect>test; //聲明一個鏈表,用於存放結構體數據 //若是想以其餘方法初始化list列表,能夠移步到下一行那個Vector的介紹
- 增
Rect a; ··· test.push_back(a); test.push_front(a); //頭尾插入(雙向鏈表) //定點插入 test.insert(test.begin()+10,a); //在第十個節點以前插入a
- 刪
//刪除test頭部的元素 test.erase(test.begin()); //刪除test從頭至尾的元素 test.erase(test.begin(), test.end()); test.pop_back(); test.pop_front();
其實增刪仍是推薦使用迭代器來,由於直接對數據進行操做會存在必定的危險。
在本文第三部分詳細講述了List迭代器操做增刪。spa
除了這個函數:test.clear();
這個函數安全得很,反正都清理掉了。.net
- 查、改
//迭代器 list<int>::iterator p; for (p = test.begin(); p != test.end(); p++) cout << *p << " ";
要遍歷仍是首推迭代器。全部和遍歷有關的仍是用迭代器。設計
- 排
#include<algorithm> test.sort(test.begin(),test.end()); //從頭至尾,默認從小到大排序 //通常排序都是要自定義排序的: bool Comp(const int &a,const int &b) { return a>b; } sort(test.begin(),test.end(),Comp); //這樣就降序排序。
- 大小
test.size(); //容器已存入數據量 test.capacity(); //容器還能存多少數據量 //其實不用擔憂容器不夠大,容量要滿的時候它會本身擴容
- 其餘
(1)壓縮list
//去除重複的元素至只保留一個副本 test.unique(); //已通過大小排序的list才能使用
(2)合併list
test.splice(test.end(),test2);//將test2剪切到test後面
最後仍是要提一下頭文件:
分不清楚就都寫上指針
#include<algorithm> #include<list>
四、迭代器
List的迭代器和Vector仍是有必定區別的,因此我特意分一塊出來。
List的迭代器不能隨便用普通指針來替代,由於其節點不會在內存中持續存在。
List的迭代器在有一個很好的特性,就是它不會由於節點的增長或合併(splice)操做而失效,即便是刪除,也只會使得當前指向被刪節點的那個迭代器失效,而不會因記憶體的重置使得所有的迭代器失效。
本文分享 CSDN - 看,將來。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。