走近STL -- 你好,List

系列目錄:走近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


  1. 查、改
//迭代器
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);	//這樣就降序排序。

  1. 大小
test.size();	//容器已存入數據量
test.capacity();	//容器還能存多少數據量

//其實不用擔憂容器不夠大,容量要滿的時候它會本身擴容
  1. 其餘
    (1)壓縮list
//去除重複的元素至只保留一個副本
	test.unique();
	//已通過大小排序的list才能使用
(2)合併list
test.splice(test.end(),test2);//將test2剪切到test後面

最後仍是要提一下頭文件:
分不清楚就都寫上指針

#include<algorithm>
#include<list>

四、迭代器

List的迭代器和Vector仍是有必定區別的,因此我特意分一塊出來。
List的迭代器不能隨便用普通指針來替代,由於其節點不會在內存中持續存在。

List的迭代器在有一個很好的特性,就是它不會由於節點的增長或合併(splice)操做而失效,即便是刪除,也只會使得當前指向被刪節點的那個迭代器失效,而不會因記憶體的重置使得所有的迭代器失效。

填上STL刪除的大坑!
Vector的迭代器怎麼了?


本文分享 CSDN - 看,將來。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索