1. 程式人生 > >C++ STL 容器技術 之 list雙向連結串列容器

C++ STL 容器技術 之 list雙向連結串列容器

簡介:

list是雙向連結串列的一個泛化容器,它的資料元素可通過連結串列指標串接成邏輯意義上的線性表。不同於採用線性表順序儲存結構的vector和deque容器,list雙向連結串列中任一位置的元素查詢、插入和刪除,都具有高效的常數階演算法時間複雜度O(1)。

list應用基礎:

建立list物件:

1、list(const A& a=A()) 建立一個空的list物件。

如:list<int> l;

2、list(size_type n) 建立一個具有n個元素的list物件,每個list元素具有它的型別下的預設值。

如:list<int> l(10);

3、list(size_type n, const T& value) 建立一個具有n個元素的list物件,每個元素具有初始值value。

如:list<int> l(10, 5);

4、list(const list&) 通過拷貝一個list物件的各個元素值,建立一個新的list物件。

如:list<int> l1(10, 5);        list<int> l2(l1);

5、list(const InputIterator first, const InputIterator last, const A& a=A()) 通過拷貝迭代器區間[first, last)的元素值,建立一個新的list物件中,記憶體分配器可省略。

如:int iArray[] = {1,2,3};      list<int> l(iArray, iArray+3);

初始化賦值:

list提供的push_back函式常用來進行list容器的初始化,push_back函式在容器的尾端插入新元素value。

void push_back(const T& value)

元素的遍歷訪問:

由於連結串列中的資料需要一個個元素進行遍歷,因此list元素的遍歷只使用迭代器的方式進行。

元素的插入:

由於list連結串列元素的插入不需要對其他元素進行移位拷貝,因此,list的元素插入函式具有常數階的O(1)演算法複雜度。除了push_back函式在尾部新增元素外,list還有在鏈首插入元素的push_front函式和在任意迭代器位置插入的insert函式。

iterator insert(iterator pos, const T& x)

void push_front(const T&)

元素的刪除:

iterator erase(iterator pos) 刪除迭代器pos所指的連結串列元素

iterator erase(iterator first, iterator last) 刪除迭代器區間[first, last)的所有連結串列元素

void clear() 刪除所有連結串列元素

void pop_front() 刪除list的第一個連結串列元素

void pop_back() 刪除list的最後一個連結串列元素

void remove(const T& value) 刪除list連結串列中所有元素值為value的元素

元素的反向遍歷:

reverse_iterator rbegin()

reverse_iterator rend()

list的交換:

list容器的swap函式,通過簡單地交換兩個list的頭指標,來實現list元素的交換。

void swap(list&)

list的歸併:

void splice(iterator position, list& x) 將x的連結串列歸併到當前list連結串列的position位置之前,list物件x將被清空。

void splice(iterator position, list&, iterator i) 將一個list的迭代器i值所指的元素,歸併到當前list連結串列中,並將歸併的元素從原連結串列中刪除。

void merge(list& x) 將list物件x的連結串列歸併到當前list連結串列中,並清空x連結串列。只有當前連結串列和被歸併的x連結串列的元素均預先按元素值的"<"關係排好序,merge函式才具有意義,歸併後的連結串列元素也是按"<"關係排序的。

list的元素排序:

list提供的void sort函式,按"<"關係進行list連結串列的元素排序,較小的元素排在前面。

list的連續重複元素的刪除:

利用list的void unique函式,可將連續重複的元素刪除,僅保留一個。

舉例分析:

1、

//插入list連結串列元素
#include <list>
#include <iostream>
using namespace std;

int main(void)
{
list<int> l;
l.push_back(6);
l.push_back(8); 
l.push_back(9);
//插入連結串列元素
list<int>::iterator i, iend;
i = l.begin();
i++;
l.insert(i, 7);
l.push_front(5);
//列印連結串列元素
iend = l.end();
for (i=l.begin(); i!=iend; i++)
   cout << *i << " ";

return 0;
}

2、

//list連結串列元素的刪除
#include <list>
#include <iostream>
using namespace std;

int main(void)
{
list<int> l;
l.push_back(5);
l.push_back(6);
l.push_back(7);
l.push_back(8);
l.push_back(9);
l.push_back(9);
l.push_back(9);
l.push_back(10);
//刪除元素,剩下7、8和9
list<int>::iterator i, iend;
i = l.begin();
i++;
l.erase(i);
l.pop_back();
l.pop_front();
l.remove(9);
//列印
iend = l.end();
for (i=l.begin(); i!=iend; i++)
{
   cout << *i << " ";
}
return 0;
}

3、

//list連結串列的歸併
#include <list>
#include <iostream>
using namespace std;

void print(list<int>& l)
{
list<int>::iterator i, iend;
iend = l.end();
for (i=l.begin(); i!=iend; i++)
{
   cout << *i << " ";
}
}

int main(void)
{
list<int> l;
for (int j=1; j<=10; j++)
{
   l.push_back(j);
}
//splice()函式
list<int> carry;
carry.splice(carry.begin(), l, l.begin());
//列印carry
cout << "carry的連結串列元素為: ";
print(carry);
cout << endl;
//列印l
cout << "l的連結串列元素為: ";
print(l);
cout << endl;
//merge()函式用法
list<int> x;
x.push_back(30);
x.push_back(31);
x.push_back(32);
l.merge(x);
//列印x
cout << "x的連結串列元素為: 空";
print(x);
cout << endl;
//列印l
cout << "l的連結串列元素為: ";
print(l);
cout << endl;
return 0;
}

4、

//list連結串列元素的排序
#include <list>
#include <iostream>
using namespace std;

void print(list<int>& l)
{
list<int>::iterator i, iend;
iend=l.end();
for (i=l.begin(); i!=iend; i++)
   cout << *i << " ";
cout << endl;
}

int main(void)
{
list<int> l; 
for(int j=18; j>=0; j--)
   l.push_back(j);
cout << "排序前: ";
print(l);
//呼叫list<int>::sort()函式排序
l.sort();
cout << "排序後: ";
print(l);
return 0;
}

5、

//list連續重複元素的刪除
#include <list>
#include <iostream>
using namespace std;

int main(void)
{
list<int> l;
l.push_back(6); 
l.push_back(8);
l.push_back(6);
l.push_back(6);
l.push_back(6);
l.push_back(9);
l.push_back(13);
l.push_back(6);
l.unique();
list<int>::iterator i, iend;
iend = l.end();
for (i=l.begin(); i!=iend; i++)
   cout << *i << " ";
cout << endl;
return 0;
}