亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

關于STL中list容器的一些總結

2020-01-26 15:49:12
字體:
來源:轉載
供稿:網友

1.關于list容器

list是一種序列式容器。list容器完成的功能實際上和數據結構中的雙向鏈表是極其相似的,list中的數據元素是通過鏈表指針串連成邏輯意義上的線性表,也就是list也具有鏈表的主要優點,即:在鏈表的任一位置進行元素的插入、刪除操作都是快速的。list的實現大概是這樣的:list的每個節點有三個域:前驅元素指針域、數據域和后繼元素指針域。前驅元素指針域保存了前驅元素的首地址;數據域則是本節點的數據;后繼元素指針域則保存了后繼元素的首地址。其實,list和循環鏈表也有相似的地方,即:頭節點的前驅元素指針域保存的是鏈表中尾元素的首地址,list的尾節點的后繼元素指針域則保存了頭節點的首地址,這樣,list實際上就構成了一個雙向循環鏈。由于list元素節點并不要求在一段連續的內存中,顯然在list中是不支持快速隨機存取的,因此對于迭代器,只能通過“++”或“--”操作將迭代器移動到后繼/前驅節點元素處。而不能對迭代器進行+n或-n的操作,這點,是與vector等不同的地方。

我想把三個常用的序列式放在一起對比一下是有必要的:

vector :vector和built-in數組類似,擁有一段連續的內存空間,能非常好的支持隨即存取,即[]操作符,但由于它的內存空間是連續的,所以在中間進行插入和刪除會造成內存塊的拷貝,另外,當插入較多的元素后,預留內存空間可能不夠,需要重新申請一塊足夠大的內存并把原來的數據拷貝到新的內存空間。這些影響了vector的效率,但是實際上用的最多的還是vector容器,建議大多數時候使用vector效率一般是不錯的。

list:list就是數據結構中的雙向鏈表(根據sgi stl源代碼),因此它的內存空間是不連續的,通過指針來進行數據的訪問,這個特點使得它的隨即存取變的非常沒有效率,因此它沒有提供[]操作符的重載。但由于鏈表的特點,它可以以很好的效率支持任意地方的刪除和插入。

deque:deque是一個double-ended queue,它的具體實現不太清楚,但知道它具有以下兩個特點:它支持[]操作符,也就是支持隨即存取,并且和vector的效率相差無幾,它支持在兩端的操作:push_back,push_front,pop_back,pop_front等,并且在兩端操作上與list的效率也差不多。

因此在實際使用時,如何選擇這三個容器中哪一個,應根據你的需要而定,具體可以遵循下面的原則:
1. 如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector
2. 如果你需要大量的插入和刪除,而不關心隨即存取,則應使用list
3. 如果你需要隨即存取,而且關心兩端數據的插入和刪除,則應使用deque。

2.list中常用的函數

2.1 list中的構造函數:

list() 聲明一個空列表;

list(n) 聲明一個有n個元素的列表,每個元素都是由其默認構造函數T()構造出來的

list(n,val) 聲明一個由n個元素的列表,每個元素都是由其復制構造函數T(val)得來的

list(n,val) 聲明一個和上面一樣的列表

list(first,last) 聲明一個列表,其元素的初始值來源于由區間所指定的序列中的元素

--------------------------------------------------------------------------------

2.2 begin()和end():通過調用list容器的成員函數begin()得到一個指向容器起始位置的iterator,可以調用list容器的 end() 函數來得到list末端下一位置,相當于:int a[n]中的第n+1個位置a[n],實際上是不存在的,不能訪問,經常作為循環結束判斷結束條件使用。

--------------------------------------------------------------------------------

2.3 push_back() 和push_front():使用list的成員函數push_back和push_front插入一個元素到list中。其中push_back()從list的末端插入,而 push_front()實現的從list的頭部插入。

--------------------------------------------------------------------------------

2.4 empty():利用empty() 判斷list是否為空。

--------------------------------------------------------------------------------

2.5 resize(): 如果調用resize(n)將list的長度改為只容納n個元素,超出的元素將被刪除,如果需要擴展那么調用默認構造函數T()將元素加到list末端。如果調用resize(n,val),則擴展元素要調用構造函數T(val)函數進行元素構造,其余部分相同。

--------------------------------------------------------------------------------

2.6 clear(): 清空list中的所有元素。

--------------------------------------------------------------------------------

2.7 front()和back(): 通過front()可以獲得list容器中的頭部元素,通過back()可以獲得list容器的最后一個元素。但是有一點要注意,就是list中元素是空的時候,這時候調用front()和back()會發生什么呢?實際上會發生不能正常讀取數據的情況,但是這并不報錯,那我們編程序時就要注意了,個人覺得在使用之前最好先調用empty()函數判斷list是否為空。

--------------------------------------------------------------------------------

2.8 pop_back和pop_front():通過刪除最后一個元素,通過pop_front()刪除第一個元素;序列必須不為空,如果當list為空的時候調用pop_back()和pop_front()會使程序崩掉。

--------------------------------------------------------------------------------

2.9 assign():具體和vector中的操作類似,也是有兩種情況,第一種是:l1.assign(n,val)將 l1中元素變為n個T(val)。第二種情況是:l1.assign(l2.begin(),l2.end())將l2中的從l2.begin()到l2.end()之間的數值賦值給l1。

--------------------------------------------------------------------------------

2.10 swap():交換兩個鏈表(兩個重載),一個是l1.swap(l2); 另外一個是swap(l1,l2),都可能完成連個鏈表的交換。

--------------------------------------------------------------------------------

2.11 reverse():通過reverse()完成list的逆置。

--------------------------------------------------------------------------------

2.12 merge():合并兩個鏈表并使之默認升序(也可改),l1.merge(l2,greater<int>()); 調用結束后l2變為空,l1中元素包含原來l1 和 l2中的元素,并且排好序,升序。其實默認是升序,greater<int>()可以省略,另外greater<int>()是可以變的,也可以不按升序排列。

看一下下面的程序:

復制代碼 代碼如下:

#include <iostream>
#include <list>

using namespace std;

int main()
{
    list<int> l1;
    list<int> l2(2,0);
    list<int>::iterator iter;
    l1.push_back(1);
    l1.push_back(2);
    l2.push_back(3);
    l1.merge(l2,greater<int>());//合并后升序排列,實際上默認就是升序
    for(iter = l1.begin() ; iter != l1.end() ; iter++)
    {
        cout<<*iter<<" ";
    }
    cout<<endl<<endl;
    if(l2.empty())
    {
        cout<<"l2 變為空 !!";
    }
    cout<<endl<<endl;
    return 0;
}


運行結果:

2.13 insert():在指定位置插入一個或多個元素(三個重載):

l1.insert(l1.begin(),100); 在l1的開始位置插入100。

l1.insert(l1.begin(),2,200); 在l1的開始位置插入2個100。

l1.insert(l1.begin(),l2.begin(),l2.end());在l1的開始位置插入l2的從開始到結束的所有位置的元素。

--------------------------------------------------------------------------------

2.14 erase():刪除一個元素或一個區域的元素(兩個重載)

l1.erase(l1.begin()); 將l1的第一個元素刪除。

l1.erase(l1.begin(),l1.end()); 將l1的從begin()到end()之間的元素刪除。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线国产精品| 亚洲视频日韩精品| 成人av资源在线播放| 亚洲2020天天堂在线观看| 亚洲韩国日本中文字幕| 最新91在线视频| 懂色av一区二区三区| 国产视频久久网| 国产在线999| 精品国产欧美一区二区三区成人| 久久久久久成人| 午夜精品一区二区三区在线| 精品国产一区av| 91爱视频在线| 国产亚洲成av人片在线观看桃| 久久免费观看视频| 国产suv精品一区二区| 成人免费视频xnxx.com| 成人av在线网址| 97超碰蝌蚪网人人做人人爽| 亚洲精品日韩在线| 亚洲欧美另类自拍| 一区二区三区美女xx视频| 欧美性高跟鞋xxxxhd| 精品视频在线观看日韩| 成人a视频在线观看| 欧美日韩性视频在线| 成人免费网视频| 夜夜嗨av色综合久久久综合网| 97av在线视频| 亚洲精品国产免费| 成人av在线网址| 亚洲国产91色在线| 午夜精品久久久久久久久久久久| 欧美电影免费观看电视剧大全| 国产精品99蜜臀久久不卡二区| 中文字幕日韩精品有码视频| 亚洲精品wwww| 韩国美女主播一区| 欧美在线视频播放| 91精品视频网站| 精品国产鲁一鲁一区二区张丽| 精品少妇一区二区30p| 亚洲香蕉成人av网站在线观看| 狠狠综合久久av一区二区小说| 国产极品jizzhd欧美| 久久精品青青大伊人av| 久久精品2019中文字幕| 欧美小视频在线观看| 91精品国产九九九久久久亚洲| 久久亚洲精品中文字幕冲田杏梨| 欧美激情精品久久久久久大尺度| 久久理论片午夜琪琪电影网| 日韩欧美一区二区三区| 91久久久久久国产精品| 国模极品一区二区三区| 欧美日韩在线视频观看| 国产精品视频导航| 久久人人爽人人爽人人片av高请| 亚洲日本成人女熟在线观看| 欧美精品在线极品| 日韩视频第一页| 国产精品69精品一区二区三区| 欧美午夜激情在线| 免费97视频在线精品国自产拍| 亚洲成人免费在线视频| 久久成年人视频| 欧美日韩性视频在线| 国产一区二区三区视频在线观看| 91成人福利在线| 夜夜嗨av色一区二区不卡| 日本高清+成人网在线观看| 91精品久久久久久久| 色偷偷av一区二区三区乱| 亚洲一区二区久久久久久| 日韩av免费看| 欧美精品制服第一页| 91色琪琪电影亚洲精品久久| 欧美成人免费网| 精品夜色国产国偷在线| 日韩女优在线播放| 欧洲永久精品大片ww免费漫画| 国产日本欧美视频| 亚洲国产天堂久久国产91| 夜夜嗨av一区二区三区四区| 亚洲最大成人网色| 奇米影视亚洲狠狠色| 亚洲欧美日韩高清| 国产在线播放91| 亚洲第一在线视频| 精品视频久久久久久久| 久久久久久久久久国产精品| 91高潮精品免费porn| 欧美电影《睫毛膏》| 人人澡人人澡人人看欧美| 欧美激情中文网| 亚洲国产精品电影在线观看| 久久的精品视频| 欧美日本高清视频| 91亚洲精华国产精华| 欧美一级免费视频| 色综合老司机第九色激情| 欧美人与物videos| 欧美小视频在线观看| 成人天堂噜噜噜| 亚洲精品自拍视频| 亚洲成色www8888| 91国产视频在线| 欧美日韩xxx| 久久伊人91精品综合网站| 国产日韩一区在线| 久久天天躁狠狠躁老女人| 亚洲精品久久久久久下一站| 2020国产精品视频| 日韩av免费在线播放| 亚洲欧美日韩高清| 国产日韩在线播放| 91精品视频免费看| 97视频色精品| 最近2019中文免费高清视频观看www99| 日韩精品亚洲元码| 自拍亚洲一区欧美另类| 久久精品青青大伊人av| 一区二区三欧美| 亚洲网站视频福利| 亚洲网站在线看| 亚洲免费影视第一页| 2019中文字幕在线观看| 中国日韩欧美久久久久久久久| 久久中国妇女中文字幕| 色哟哟网站入口亚洲精品| 日韩成人av在线| 日韩av资源在线播放| 亚洲国产精品人人爽夜夜爽| 日韩中文字幕在线看| 欧美午夜片欧美片在线观看| 精品日本美女福利在线观看| 亚洲欧美一区二区精品久久久| 国产69精品久久久| 国产精品∨欧美精品v日韩精品| 中文一区二区视频| 国产精品999| 亚洲精品国产精品自产a区红杏吧| 久久在线精品视频| 成人免费高清完整版在线观看| 高潮白浆女日韩av免费看| 日韩风俗一区 二区| 亚洲国产日韩欧美在线图片| 亚洲精品国产综合区久久久久久久| 91天堂在线视频| 精品国产美女在线| 成人黄色大片在线免费观看| 538国产精品一区二区在线| 91香蕉国产在线观看| 亚洲欧美日韩一区二区在线| 亚洲一区999| 国产精品久久久91| 51ⅴ精品国产91久久久久久| 色妞一区二区三区| 亚洲xxxx3d| 欧美激情成人在线视频| 日韩av观看网址| 国产精品99导航| 亚洲天堂免费视频|