close

按此前往C++完整教學目錄

 

* 朋友們若是覺得本教學對您有幫助,請點個讚~

 

串列(list)

為使用雙鍊結串列(double linked list)資料結構設計而成的容器。每個元素有其相對應的「節點」,節點之中儲存元素的值,還有兩個指標:指向上一個節點的記憶位址、下一個節點的記憶位址。串列中節點的記憶位址並不需要相鄰,在呼叫串列的某元素時,是從串列的第一個節點開始,一個節點一個節點的連接,因此無法用 串列名稱[n] 來呼叫序數為n的元素。以下是雙鍊結串列的示意圖:

image

 

1. 欲使用串列時,需在標頭檔內寫下#include <list>

2.

(1) 串列的建構與向量、佇列同,如:list<int> a; 等等。

串列的元素,亦可以一般資料形態或物件(同樣,若是物件,則類別或結構應寫在主程式之前)

(2) 串列迭代器的宣告與向量、佇列同,如:list<int>::iterator i; 等等。

串列迭代器必須使用i++的方式,跳到下一個元素位址。若是使用i=i+1;,因串列中元素未必各個相鄰,故可能造成錯誤。

(3) push_backpop_backbeginendrbeginrendsizeresizeclearempty這些成員函式的用法皆同於向量(請看向量篇教學)。

 

3. 插入與移除元素:

bool even(int x)

{

if(x%2==0)return true;

else return false;

}

 

int main(int argc, char *argv[]) //主程式在此

int tt[9]={1,2,3,4,5,6,7,8,9};   

list<int> a(tt,tt+9);    //tt中,「tt初始元素位置」到「初始後第九個元素位置」的元素都複製給a

list<int>::iterator I,j,k;

for(i=a.begin();i!=a.end();i++)

{cout<<*i<<",";}cout<<endl;   //顯示:1,2,3,4,5,6,7,8,9,

[操作程式碼//以下有說明

for(i=a.begin();i!=a.end();i++)

{cout<<*i<<",";}cout<<endl;   //最終結果顯示

(1) [操作程式碼]為:串列名稱.remove(資料值),則會把串列中符合此值的資料都移除掉。如:a.remove(2);,最終結果顯示為1,3,4,5,6,7,8,9,

(2) 所謂「真假判斷式」,指的是回傳bool值的函式。若此回傳bool值的函式輸入參數只有一個,稱之為「單元判斷式」;若此回傳bool值的函式輸入參數有二個,稱之為「雙元判斷式」;以此類推。

[操作程式碼]為:串列名稱.remove_if(單元判斷式名稱),則會把串列中的值代入此單元判斷式,符合此單元判斷式的資料都移除掉。如:a.remove_if(even);,最終結果顯示為1,3,5,7,9,

(3) [操作程式碼]為:串列名稱.erase(迭代器),則會把迭代器所指的元素給刪除,並回傳被移除元素後一個節點位址的迭代器。如:

j=a.begin();

j=j++;

a.erase(j);

最終結果顯示為:2,3,4,5,6,7,8,9,

(4) [操作程式碼]為:串列名稱.erase(迭代器1 , 迭代器2),則會把兩迭代器之間的元素給刪除,並回傳最後被移除元素之後一個節點位址的迭代器。如:j=a.begin();

j=j++;

k=a.end();

k--;

k--;

a.erase(j,k);

最終結果顯示為:8,9,

(5) [操作程式碼]為:串列名稱.insert(迭代器 , ),則會在迭代器所指的位址上,加入此值元素,並回傳此新元素位址的迭代器。如:

j=a.begin();

j=j++;

a.insert(j,10);

最終結果顯示為:10,1,2,3,4,5,6,7,8,9,

(6) [操作程式碼]為:串列名稱.insert(迭代器 , 非負整數N , ),則會在迭代器所指的位址上,加入N個此值元素。如:

j=a.begin();

j=j++;

a.insert(j,3,10);

最終結果顯示為:10,10,10,1,2,3,4,5,6,7,8,9,

(7) [操作程式碼]為:串列名稱.insert(迭代器1 , 迭代器2, 迭代器3),則會將該串列從迭代器2到迭代器3之間的元素複製並且插入迭代器1的位址。如:i=a.begin();

j=a.begin();

k=a.end();

i++; j++; j++; j++; k--;

a.insert(i,j,k);

最終結果顯示為:1,4,5,6,7,8,2,3,4,5,6,7,8,9,

評:因串列元素資料的記憶空間位址並非緊鄰,故不可用i=i+n(n為整數)來直接指定迭代器位址,而要靠i++i--來逐項移動。

 

 

上一篇:多維向量

下一篇:list的其他常用功能

arrow
arrow
    創作者介紹
    創作者 埃伯 的頭像
    埃伯

    程式語言教學

    埃伯 發表在 痞客邦 留言(0) 人氣()