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...