【STL記錄】Containers--Lists

list以雙鏈表的形式管理元素:ios

使用list時,須要加上頭文件:spa

#include <list>

list與array,vector,deque的不一樣之處:指針

  • list不提供隨機訪問,好比要訪問第五個元素,你必須從第一個元素開始經過鏈指針到第五個元素。所以,訪問任意元素時較慢。
  • 在任意位置插入和刪除元素很快,而且時間相同。
  • list支持的異常處理:每一次操做成功或是一個no-op.

Special Modifying Operations for List

Operation Effect
 c.unique() 移除相同元素值的元素,使惟一
 c.unique(op) 當op()爲true時移除相同元素,使惟一
 c.splice(pos, c2) 將c2的所有元素移動到c的pos位置前
 c.splice(pos, c2, c2pos) 將c2的c2pos位置的元素移動到c的pos位置前
 c.splice(pos, c2, c2beg, c2end) 將c2的[c2beg, c2end)元素移動到c的pos位置前
 c.sort() 以<排序全部元素
 c.sort(op) 以op()排序全部操做
 c.merge(c2) 假定兩container中的元素都是已排序的,移動c2的元素到c中,並保持排序
 c.merge(c2, op) 假定兩container中的元素都是根據op()排序的,移動c2的元素到c中,並保持op()排序
 c.reverse() 顛倒全部元素的順序

Example of Using Lists

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

void printLists(const list<int>& l1, const list<int>& l2)
{
	cout << "list1: ";
	copy(l1.cbegin(), l1.cend(), ostream_iterator<int>(cout, " "));
	cout << endl << "list2: ";
	copy(l2.cbegin(), l2.cend(), ostream_iterator<int>(cout, " "));
	cout << endl << endl;
}

int main()
{
	//create two empty lists
	list<int> list1, list2;
	
	//fill both list with elements
	for(int i=0; i < 6; ++i) {
		list1.push_back(i);
		list2.push_front(i);
	}
	printLists(list1, list2);
	
	//insert all elements of list1 before the first element with value 3 of list2
	//- find() returns an iterator to the first element with value 3
	list2.splice(find(list2.begin(), list2.end(), 3), list1);
	printLists(list1, list2);
	
	//move first element of list2 to the end
	list2.splice(list2.end(), list2, list2.begin());
	printLists(list1, list2);
	
	//sort second list, assign to list1 and remove duplicates
	list2.sort();
	list1 = list2;
	list2.unique();
	printLists(list1, list2);
	
	//merge both sorted lists into the first list
	list1.merge(list2);
	printLists(list1, list2);
}

輸出:code

相關文章
相關標籤/搜索