標籤:鏈表 name 產生 iter begin 全域 div 析構 構造
1、結構
list使用一個double linked list(雙向鏈表)來管理元素。
2、 list 能力
list內部結構和vector或deque截然不同,所以與他們的區別:
list不支援隨機存取,需要存取某個元素,需要遍曆之前所有的元素,是很緩慢的行為。
任何位置上(不止是兩端)安插和刪除元素都非常快,始終都是在常數時間內完成,因為無需移動其他任何操作,實際上只進行了一些指標操作。
安插和刪除並不會造成指向其他元素的各個pointers、reference、iterators失效
list是原子操作,要麼成功,要麼失敗,不會說只執行一半。
list不支援隨機存取,不提供下標操作符和at()函數。
list不提供容量,記憶體配置的操作函數,因為完全沒必要,每個元素都有自己的記憶體空間,在刪除之前一直有效。
list提供專門的函數用於移動函數,這些函數執行效率高,無需元素的拷貝和移動,只需要調整若干指標。
3、操作函數3.1 構造和析構
操作 |
效果 |
list<Elem> c |
產生一個空的list |
list<Elem> c1(c2) |
產生一個c2同型的list,每個元素都被複製 |
list<Elem> c(n) |
產生一個n個元素的list,每個元素都由default構造產生 |
list<Elem> c(n,elem) |
產生一個n個元素的list,每個元素都是elem的副本 |
list<Elem> c (beg,end) |
產生一個list以區間[beg,end)內所有元素作為初值 |
c.~list<Elem>() |
銷毀所有元素,釋放記憶體 |
3.2 非變動性操作
操作 |
效果 |
c.size() |
返回當前的元素數量 |
c.empty() |
判斷大小是否為零,等同於0 == size(),效率更高 |
c.max_size() |
返回能容納的元素最大數量 |
c1 == c2 |
判斷c1是否等於c2 |
c1 != c2 |
判斷c1是否不等於c2(等同於!(c1==c2)) |
c1 < c2 |
判斷c1是否小於c2 |
c1 > c2 |
判斷c1是否大於c2 |
c1 <= c2 |
判斷c1是否小於等於c2(等同於!(c2<c1)) |
c1 >= c2 |
判斷c1是否大於等於c2 (等同於!(c1<c2)) |
3.3 賦值
操作 |
效果 |
c1 = c2 |
將c2的元素全部賦值給c1 |
c.assign(n,elem) |
將elem的n個副本拷貝給c |
c.assign(beg,end) |
建立一個list,區間[beg,end)內的所有元素作為初值 |
c1.swap(c2) |
c1和c2元素互換 |
swap(c1,c2) |
c1和c2元素互換,全域函數 |
3.3 元素存取
list不支援隨機存取,只有front()和back()能直接存取元素。
操作 |
效果 |
c.front() |
返回第一個元素,不檢查元素是否存在 |
c.back() |
返回最後一個元素,不檢查元素是否存在 |
3.4 迭代器相關函數
list只有使用迭代器才能對元素進行存取,list不支援隨機存取,所以這些迭代器是雙向迭代器,凡是用到隨機存取迭代器的演算法都不能使用。
操作 |
效果 |
c.begin() |
返回一個隨機存取迭代器,指向第一個元素 |
c.end() |
返回一個隨機存取迭代器,指向最後一個元素的下一個位置 |
c.rbegin() |
返回一個逆向迭代器,指向逆向迭代的第一個元素 |
c.rend() |
返回一個逆向迭代器,指向逆向迭代的最後一個元素的下一個位置 |
3.5 元素的安插和移除
list提供了deque的所有功能,還增加了remove()和remove_if()應用於list。
操作 |
效果 |
c.insert(pos, elem) |
在迭代器pos位置插入一個elem副本,返回新元素位置 |
c.insert(pos,n, elem) |
在迭代器pos位置插入n個elem副本,無傳回值 |
c.insert(pos, beg,end) |
在迭代器pos位置插入區間[beg,end)內所有元素的副本,無傳回值 |
c.push_back(elem) |
在尾部追加一個elem副本 |
c.pop_back() |
移除最後一個元素,不返回 |
c.push_front(elem) |
在頭部安插一個elem副本 |
c.pop_front() |
移除第一個元素,不返回 |
c.remove(val) |
移除所有值為val的元素 |
c.remove_if(op) |
移除所有“造成op(elem)為true”的元素 |
c.erase(pos) |
移除迭代器pos所指元素,返回下一元素位置 |
c.erase(beg,end) |
移除區間[beg,end)內的所有元素,返回下一元素位置 |
c.resize(num) |
將元素容量重設為num個,如果size變大,則以default建構函式構造所有元素 |
c.resize (num, elem) |
將元素容量重設為num個,如果size變大,則所有元素為elem的副本 |
c. clear () |
移除所有元素,將整個容器清空 |
3.6 特殊變動性操作
操作 |
效果 |
c.unique() |
如果存在若干相鄰而數值相等的元素,移除重複元素,只留下一個 |
c.unique(op) |
若存在若干相鄰元素,都使op()為true,移除重複元素,只留下一個 |
c1.splice(pos,c2) |
將所有c2元素移到c1容器pos迭代器之前 |
c1.splice(pos,c2,c2pos) |
將c2 pos位置元素移到c1元素pos位置,c1和c2可以相同 |
c1.splice(pos,c2,c2beg,c2end) |
將c2區間[c2beg,c2end)所有元素移到c1 pos位置之前,c1和c2可以相同 |
c.sort() |
以operator < 為準,對所有元素排序 |
c.sort(op) |
以op()為準,對c排序 |
c1.merge(c2) |
假設c1和c2已序,將c2元素移動到c1,並保證合并後的list仍為已序 |
c1.merge(c2,op) |
假設c1和c2都以op()為序,將c2移動到c1仍然以op()已序 |
c.reverse() |
將所有元素反序 |
4、範例程式碼
// cont/list1.cpp #include <iostream> #include <list> #include <algorithm> using namespace std; void printLists (const list<int>& 11, const list<int>& 12) { cout << "list1: "; copy (l1.begin(), l1.end(), ostream_iterator<int>(cout," ")); cout << endl << "list2: "; copy (12.begin(), 12.end(), ostream_iterator<int>(cout," ")); cout << endl << endl; } int main() { //create two empty lists list<int> list1, list2; //fill both lists 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(), // destination position 3), list1); // source list printLists(list1, list2); //move first element to the end list2.splice(list2.end(), // destination position list2, // source list list2.begin()); // source position 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); }
輸出:
list1: 0 1 2 3 4 5 list2: 5 4 3 2 1 0 list1: list2: 5 4 0 1 2 3 4 5 3 2 1 0 list1: list2: 4 0 1 2 3 4 5 3 2 1 0 5 list1: 0 0 1 1 2 2 3 3 4 4 5 5 list2: 0 1 2 3 4 5 list1: 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 list2:
【C++ STL】List