stl之list雙向鏈表容器應用基礎

不同於採用線性表順序存儲結構的vector和deque容器,list雙向鏈表中任一位置的元素差值、插入和刪除,都具有高效的常數階算法時間複雜度O(1)。

頭文件

#include<list>

創建list對象

1)list();//創建一個沒有任何元素的list對象。

list<int>l 
2)list(size_type n);//創建一個具有n個元素的list對象,每個元素採用它的類型下的默認值。

list<int>l(10);//list對象l有10個元素,每個元素初始值爲。
3)list<size_type n, constT& value); //創建一個具有n個元素的list對象,這些元素的初始值爲value

list<double>l(10,5.6); 
4)list(const list&);//list的拷貝構造函數,通過拷貝一個list對象的元素值,創建一個新的list對象。

list<char>l1(5,’a’); 
list<char>l2(l1); 
5)list(const InputIterator first, const InputIterator last,const A& a=A());

//將迭代區間[first,last)所指的元素拷貝到一個新創建的list對象中,其中內存分配器可缺省。

//利用int數組iArray,創建一個list對象l 
intiArray[]={1,2,3,4,5,6,7}; 
list<int>l(iArray, iArray+7); // 創建list對象

初始化賦值

利用list提供的push_back函數,可將元素依次鏈入鏈表中。push_back函數常用於list容器的初始化

元素的遍歷訪問

由於鏈表中元素需要一個個元素遍歷,因此,list元素的遍歷只能使用迭代器的方式進行。

#include <iostream>
#include <list>
using namespace std;
int main ()
{
	int Array[] = {16,2,77,29};
	//用上面第五種方式創建list對象
	list<int> mylist(Array,Array+sizeof(Array)/sizeof(int));
	//遍歷輸出
	for (list<int>::iterator it = mylist.begin(); it != mylist.end(); it++)
		std::cout << *it << ' ';
	std::cout << '\n';
	return 0;
}

list鏈表元素的插入

由於list鏈表元素的插入不需要對其他元素進行移位拷貝,因此list元素的插入函數是有常數階的O(1)算法時間複雜度。

voidpush_front(constT&);//頭部插入

iteratorinsert(iterator pos, const T& x);//pos位置之前,插入新元素x

具體實例與前篇deque的應用相似,這裏不再多說。

list鏈表元素的刪除

list同樣具有高效的鏈表元素刪除處理,包括刪除首元素pop_front函數、刪除尾元素的pop_back函數,刪除任意位置或迭代區間上元素的erase函數,以及刪除所有元素的clear函數。

1)void pop_front();//刪除 list的第一個鏈表元素

2)void pop_back();//刪除 list的最後一個鏈表元素

3)iteratorerase(iterator pos);//刪除 pos所指向的鏈表元素

4)iteratorerase(iterator first, iterator last);//刪除迭代器區間 [first, last)所指向的所有鏈表元素

5)void clear();//刪除所有 list鏈表元素

6)void remove(constT& value);//刪除 list鏈表中所有元素值爲 value的元素

具體實例與前篇deque的應用相似,這裏不再多說。

list鏈表的歸併

list 鏈表元素的排序,是將 list鏈表分割成若干部分進行子排序,然後通過歸併處理,實現 list的所有元素的排序。爲此,list容器提供了 splice merge歸併函數。

1)void splice(iterator position, list& x);// x的鏈表歸併到當前 list鏈表的 position位置之前, list對象 x將被清空

void splice(iterator position, list& x, iterator i);//將一個 list的迭代器 i 值所指的元素,歸併到當前 list列表中,並將被歸併的元素從原鏈表中刪除。

void merge(list& x);//list對象 x的鏈表歸併到當前 list鏈表中,並清空 x的鏈表。從merge 函數的源碼可看出,只有當前 list鏈表和被歸併的 x鏈表的元素,均預先按照元素值的 "<"關係排好,merge函數才具有意義,歸併後的鏈表元素也是按 "<"關係排序的。

#include <list>
#include <iostream>
using namespace std;

void print(list<int>& l);
int main()
{
	list<int> l;
	list<int> carry;
	for (int j=1; j<=10; j++)
	{
		l.push_back(j);
	}
	// splice() 函數
	carry.splice(carry.begin(), l, ++l.begin());
	// 打印carry
	cout << "carry 的鏈表元素爲: ";
	print(carry);
	// 打印l
	cout << "l 的鏈表的元素爲:";
	print(l);
	// merge() 函數用法
	list<int> x;
	x.push_back(30);
	x.push_back(31);
	x.push_back(32);
	l.merge(x);
	// 打印x
	cout << "x 的鏈表元素爲空";
	print(x);
	// 打印l
	cout << "l 的鏈表元素爲:";
	print(l);
	return 0;
}
// list 鏈表打印
void print(list<int>& l)
{
	list<int>::iterator i, iend;
	iend = l.end();
	for (i=l.begin(); i!=iend; ++i)
		cout << *i << ' ';
	cout << endl << endl;
}

list的元素排序

list 提供的 void sort函數,按 "<"關係進行 list鏈表元素排序,較小的元素排在前面。

#include <list>
#include <iostream>
using namespace std;
void print(list<int>& l);

int main()
{
	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;
}
void print(list<int>& l)
{
	list<int>::iterator i,iend;
	iend=l.end();
	for(i=l.begin(); i!=iend; i++)
		cout << *i << ' ';
	cout << endl;
}

list的連續重複元素的剔除

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

#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;
}


此文爲本人原創,轉載請註明出處:http://blog.csdn.net/lsh_2013/article/details/46742541
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章