STL常用容器 6 list容器

2021-10-21 17:53:05 字數 4418 閱讀 9094

5 案例

鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。

相較於vector的連續線性空間,list就顯得負責許多,它的好處是每次插入或者刪除乙個元素,就是配置或者釋放乙個元素的空間。因此,list對於空間的運用有絕對的精準,一點也不浪費。而且,對於任何位置的元素插入或元素的移除,list永遠是常數時間。

list和vector是兩個最常被使用的容器。

list容器是乙個雙向迴圈鍊錶。

list容器不能像vector一樣以普通指標作為迭代器,因為其節點不能保證在同一塊連續的記憶體空間上。list迭代器必須有能力指向list的節點,並有能力進行正確的遞增、遞減、取值、成員訪問操作。所謂」list正確的遞增,遞減、取值、成員取用」是指,遞增時指向下乙個節點,遞減時指向上乙個節點,取值時取的是節點的資料值,成員取用時取的是節點的成員。

由於list是乙個雙向鍊錶,迭代器必須能夠具備前移、後移的能力,所以list容器提供的是bidirectional iterators.

list有乙個重要的性質,插入操作和刪除操作都不會造成原有list迭代器的失效。這在vector是不成立的,因為vector的插入操作可能造成記憶體重新配置,導致原有的迭代器全部失效,甚至list元素的刪除,也只有被刪除的那個元素的迭代器失效,其他迭代器不受任何影響。

list容器不僅是乙個雙向鍊錶,而且還是乙個迴圈的雙向鍊錶.

list lstt;

//list採用採用模板類實現,物件的預設構造形式:

list

(beg,end)

;//建構函式將[beg, end)區間中的元素拷貝給本身。

list

(n,elem)

;//建構函式將n個elem拷貝給本身。

list

(const list &lst)

;//拷貝建構函式。

push_back

(elem)

;//在容器尾部加入乙個元素

pop_back()

;//刪除容器中最後乙個元素

push_front

(elem)

;//在容器開頭插入乙個元素

pop_front()

;//從容器開頭移除第乙個元素

insert

(pos,elem)

;//在pos位置插elem元素的拷貝,返回新資料的位置。

insert

(pos,n,elem)

;//在pos位置插入n個elem資料,無返回值。

insert

(pos,beg,end)

;//在pos位置插入[beg,end)區間的資料,無返回值。

clear()

;//移除容器的所有資料

erase

(beg,end)

;//刪除[beg,end)區間的資料,返回下乙個資料的位置。

erase

(pos)

;//刪除pos位置的資料,返回下乙個資料的位置。

remove

(elem)

;//刪除容器中所有與elem值匹配的元素。

size()

;//返回容器中元素的個數

empty()

;//判斷容器是否為空

resize

(num)

;//重新指定容器的長度為num,

//若容器變長,則以預設值填充新位置。

//如果容器變短,則末尾超出容器長度的元素被刪除。

resize

(num, elem)

;//重新指定容器的長度為num,

//若容器變長,則以elem值填充新位置。

//如果容器變短,則末尾超出容器長度的元素被刪除。

assign

(beg, end)

;//將[beg, end)區間中的資料拷貝賦值給本身。

assign

(n, elem)

;//將n個elem拷貝賦值給本身。

list&

operator=(

const list &lst)

;//過載等號操作符

swap

(lst)

;//將lst與本身的元素互換。

front()

;//返回第乙個元素。

back()

;//返回最後乙個元素。

reverse()

;//反轉鍊錶,比如lst包含1,3,5元素,執行此方法後,lst就包含5,3,1元素。

sort()

;//list排序,公升序

#include

#include

using

namespace std;

void

printlist

(const list<

int>

&l)

cout << endl;

}int

main()

對於自定義資料型別需要指定出排序規則,否則無法進行排序;

方法一:在自定義資料型別中過載 " < " [bool operator

方法二:寫乙個函式,指定排序規則

對於自定義資料型別需要指定 " == "號,才能使用remove;

#include

#include

using

namespace std;

class

person

// 過載== 使list容器的remove使用

bool

operator==(

const person &p)

return

false;}

#if 0

// 方法一

bool

operator

<

(const person& p)

// 過載<

return

this

->m_age < p.m_age;

// 年齡不同,按照年齡公升序排列

}#endif

string m_name;

// 姓名

int m_age;

// 年齡

int m_hight;

// 身高};

#if 1

// 方法二

bool

mycompare

(const person& p1,

const person& p2)

// 寫乙個函式,指定排序規則

return p1.m_age < p2.m_age;

// 寫乙個函式,指定排序規則

}#endif

intmain()

cout <<

"*************************==="

<< endl;

cout <<

"排序之後的資料:"

<< endl;

#if 0

l.sort()

;// 過載《號的呼叫方法

#endif

#if 1

l.sort

(mycompare)

;// 寫乙個函式,指定排序規則的呼叫方法

#endif

for(auto it = l.

begin()

; it != l.

end();

++it)

l.remove

(p1)

; cout <<

"*************************=="

<< endl;

cout <<

"刪除張三之後的資料:"

STL通用容器之 list 容器

list容器 相對於vector的連續線性空間,list是乙個雙向鍊錶,它有乙個重要性質 插入操作和刪除操作都不會造成原有的list迭 器失效,每次插入或刪除乙個元素,就配置或釋放乙個元素空間。也就是說,對於任何位置的元素插入或刪除,list 遠是常數時間。1 建構函式 listc 建立乙個空的li...

STL順序容器 list

list是乙個線性鍊錶結構,它的資料由若干個節點構成,每乙個節點都包括乙個 息塊 即實際儲存的資料 乙個前驅指標和乙個後驅指標。它無需分配指定 記憶體大小且可以任意伸縮,這是因為它儲存在非連續的記憶體空間中,並且由指 針將有序的元素鏈結起來。由於其結構的原因,list 隨機檢索的效能非常的不好,因為...

C 學習筆記 STL常用容器 list

list容器的功能 將資料進行鏈式儲存。stl中的鍊錶是乙個雙向迴圈鍊錶。list的優點 採用動態儲存分配,不會造成記憶體浪費和溢位 執行插入和刪除方便,修改指標的指向即可,不需要移動大量元素。list的缺點 空間 指標域 和時間 遍歷 耗費較大。list插入和刪除元素不會造成原有的迭代器的失效。l...