【C++ STL】List

來源:互聯網
上載者:User

標籤:鏈表   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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.