在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

詳細剖析C++的的3種容器

C語言專家集中營 ? 2018-01-09 12:57 ? 次閱讀

什么是容器

首先,我們必須理解一下什么是容器,在C++中容器被定義為:在數據存儲上,有一種對象類型,它可以持有其它對象或指向其它對像的指針,這種對象類型就叫做容器。很簡單,容器就是保存其它對象的對象,當然這是一個樸素的理解,這種“對象”還包含了一系列處理“其它對象”的方法,因為這些方法在程序的設計上會經常被用到,所以容器也體現了一個好處,就是“容器類是一種對特定代碼重用問題的良好的解決方案”。

容器還有另一個特點是容器可以自行擴展。在解決問題時我們常常不知道我們需要存儲多少個對象,也就是說我們不知道應該創建多大的內存空間來保存我們的對象。顯然,數組在這一方面也力不從心。容器的優勢就在這里,它不需要你預先告訴它你要存儲多少對象,只要你創建一個容器對象,并合理的調用它所提供的方法,所有的處理細節將由容器來自身完成。它可以為你申請內存或釋放內存,并且用最優的算法來執行您的命令。

容器是隨著面向對象語言的誕生而提出的,容器類在面向對象語言中特別重要,甚至它被認為是早期面向對象語言的基礎。在現在幾乎所有的面向對象的語言中也都伴隨著一個容器集,在C++中,就是標準模板庫(STL)。

和其它語言不一樣,C++中處理容器是采用基于模板的方式。標準C++庫中的容器提供了多種數據結構,這些數據結構可以與標準算法一起很好的工作,這為我們的軟件開發提供了良好的支持!

通用容器的分類

STL對定義的通用容器分三類:順序性容器、關聯式容器和容器適配器。

順序性容器是一種各元素之間有順序關系的線性表,是一種線性結構的可序群集。順序性容器中的每個元素均有固定的位置,除非用刪除或插入的操作改變這個位置。這個位置和元素本身無關,而和操作的時間和地點有關,順序性容器不會根據元素的特點排序而是直接保存了元素操作時的邏輯順序。比如我們一次性對一個順序性容器追加三個元素,這三個元素在容器中的相對位置和追加時的邏輯次序是一致的。

關聯式容器和順序性容器不一樣,關聯式容器是非線性的樹結構,更準確的說是二叉樹結構。各元素之間沒有嚴格的物理上的順序關系,也就是說元素在容器中并沒有保存元素置入容器時的邏輯順序。但是關聯式容器提供了另一種根據元素特點排序的功能,這樣迭代器就能根據元素的特點“順序地”獲取元素。

關聯式容器另一個顯著的特點是它是以鍵值的方式來保存數據,就是說它能把關鍵字和值關聯起來保存,而順序性容器只能保存一種(可以認為它只保存關鍵字,也可以認為它只保存值)。這在下面具體的容器類中可以說明這一點。

容器適配器是一個比較抽象的概念,C++的解釋是:適配器是使一事物的行為類似于另一事物的行為的一種機制。容器適配器是讓一種已存在的容器類型采用另一種不同的抽象類型的工作方式來實現的一種機制。其實僅是發生了接口轉換。那么你可以把它理解為容器的容器,它實質還是一個容器,只是他不依賴于具體的標準容器類型,可以理解是容器的模版。或者把它理解為容器的接口,而適配器具體采用哪種容器類型去實現,在定義適配器的時候可以由你決定。

下表列出STL定義的三類容器所包含的具體容器類:

標準容器類 特點
順序性容器
vector 從后面快速的插入與刪除,直接訪問任何元素
deque 從前面或后面快速的插入與刪除,直接訪問任何元素
list 雙鏈表,從任何地方快速插入與刪除
關聯容器
set 快速查找,不允許重復值
multiset 快速查找,允許重復值
map 一對多映射,基于關鍵字快速查找,不允許重復值
multimap 一對多映射,基于關鍵字快速查找,允許重復值
容器適配器
stack 后進先出
queue 先進先出
priority_queue 最高優先級元素總是第一個出列

vector ,deque和list

順序性容器:

向量vector:

是一個線性順序結構。相當于數組,但其大小可以不預先指定,并且自動擴展。它可以像數組一樣被操作,由于它的特性我們完全可以將vector看作動態數組。在創建一個vector后,它會自動在內存中分配一塊連續的內存空間進行數據存儲,初始的空間大小可以預先指定也可以由vector默認指定,這個大小即capacity()函數的返回值。當存儲的數據超過分配的空間時vector會重新分配一塊內存塊,但這樣的分配是很耗時的,在重新分配空間時它會做這樣的動作:

首先,vector會申請一塊更大的內存塊;

然后,將原來的數據拷貝到新的內存塊中;

其次,銷毀掉原內存塊中的對象(調用對象的析構函數);

最后,將原來的內存空間釋放掉。

如果vector保存的數據量很大時,這樣的操作一定會導致糟糕的性能(這也是vector被設計成比較容易拷貝的值類型的原因)。所以說vector不是在什么情況下性能都好,只有在預先知道它大小的情況下vector的性能才是最優的。

vector的特點:(1)指定一塊如同數組一樣的連續存儲,但空間可以動態擴展。即它可以像數組一樣操作,并且可以進行動態操作。通常體現在push_back() pop_back()。(2)隨機訪問方便,它像數組一樣被訪問,即支持[ ]操作符和vector.at()(3)節省空間,因為它是連續存儲,在存儲數據的區域都是沒有被浪費的,但是要明確一點vector大多情況下并不是滿存的,在未存儲的區域實際是浪費的。

(4)在內部進行插入、刪除操作效率非常低,這樣的操作基本上是被禁止的。Vector被設計成只能在后端進行追加和刪除操作,其原因是vector內部的實現是按照順序表的原理。(5)只能在vector的最后進行push和pop,不能在vector的頭進行push和pop。(6)當動態添加的數據超過vector默認分配的大小時要進行內存的重新分配、拷貝與釋放,這個操作非常消耗性能。所以要vector達到最優的性能,最好在創建vector時就指定其空間大小。

雙向鏈表list

是一個線性鏈表結構,它的數據由若干個節點構成,每一個節點都包括一個信息塊(即實際存儲的數據)、一個前驅指針和一個后驅指針。它無需分配指定的內存大小且可以任意伸縮,這是因為它存儲在非連續的內存空間中,并且由指針將有序的元素鏈接起來。

由于其結構的原因,list隨機檢索的性能非常的不好,因為它不像vector那樣直接找到元素的地址,而是要從頭一個一個的順序查找,這樣目標元素越靠后,它的檢索時間就越長。檢索時間與目標元素的位置成正比。

雖然隨機檢索的速度不夠快,但是它可以迅速地在任何節點進行插入和刪除操作。因為list的每個節點保存著它在鏈表中的位置,插入或刪除一個元素僅對最多三個元素有所影響,不像vector會對操作點之后的所有元素的存儲地址都有所影響,這一點是vector不可比擬的。

list的特點:(1)不使用連續的內存空間這樣可以隨意地進行動態操作;(2)可以在內部任何位置快速地插入或刪除,當然也可以在兩端進行push和pop。(3)不能進行內部的隨機訪問,即不支持[ ]操作符和vector.at();(4)相對于verctor占用更多的內存。

雙端隊列deque是一種優化了的、對序列兩端元素進行添加和刪除操作的基本序列容器。它允許較為快速地隨機訪問,但它不像vector把所有的對象保存在一塊連續的內存塊,而是采用多個連續的存儲塊,并且在一個映射結構中保存對這些塊及其順序的跟蹤。向deque兩端添加或刪除元素的開銷很小。它不需要重新分配空間,所以向末端增加元素比vector更有效。

實際上,deque是對vector和list優缺點的結合,它是處于兩者之間的一種容器。

deque的特點:(1)隨機訪問方便,即支持[ ]操作符和vector.at(),但性能沒有vector好;(2)可以在內部進行插入和刪除操作,但性能不及list;(3)可以在兩端進行push、pop;

三者的比較

下圖描述了vector、list、deque在內存結構上的特點:

詳細剖析C++的的3種容器

vector是一段連續的內存塊,而deque是多個連續的內存塊,list是所有數據元素分開保存,可以是任何兩個元素沒有連續。

vector的查詢性能最好,并且在末端增加數據也很好,除非它重新申請內存段;適合高效地隨機存儲。

list是一個鏈表,任何一個元素都可以是不連續的,但它都有兩個指向上一元素和下一元素的指針。所以它對插入、刪除元素性能是最好的,而查詢性能非常差;適合大量地插入和刪除操作而不關心隨機存取的需求。

deque是介于兩者之間,它兼顧了數組和鏈表的優點,它是分塊的鏈表和多個數組的聯合。所以它有被list好的查詢性能,有被vector好的插入、刪除性能。如果你需要隨即存取又關心兩端數據的插入和刪除,那么deque是最佳之選。

關聯容器

set, multiset, map, multimap是一種非線性的樹結構,具體的說采用的是一種比較高效的特殊的平衡檢索二叉樹——紅黑樹結構。(至于什么是紅黑樹,我也不太理解,只能理解到它是一種二叉樹結構)

因為關聯容器的這四種容器類都使用同一原理,所以他們核心的算法是一致的,但是它們在應用上又有一些差別,先描述一下它們之間的差別。

set,又稱集合,實際上就是一組元素的集合,但其中所包含的元素的值是唯一的,且是按一定順序排列的,集合中的每個元素被稱作集合中的實例。因為其內部是通過鏈表的方式來組織,所以在插入的時候比vector快,但在查找和末尾添加上被vector慢。

multiset,是多重集合,其實現方式和set是相似的,只是它不要求集合中的元素是唯一的,也就是說集合中的同一個元素可以出現多次。

map,提供一種“鍵-值”關系的一對一的數據存儲能力。其“鍵”在容器中不可重復,且按一定順序排列(其實我們可以將set也看成是一種鍵-值關系的存儲,只是它只有鍵沒有值。它是map的一種特殊形式)。由于其是按鏈表的方式存儲,它也繼承了鏈表的優缺點。

multimap, 和map的原理基本相似,它允許“鍵”在容器中可以不唯一。

關聯容器的特點是明顯的,相對于順序容器,有以下幾個主要特點:

1,其內部實現是采用非線性的二叉樹結構,具體的說是紅黑樹的結構原理實現的;

2,set和map保證了元素的唯一性,mulset和mulmap擴展了這一屬性,可以允許元素不唯一;

3,元素是有序的集合,默認在插入的時候按升序排列。

基于以上特點,

1,關聯容器對元素的插入和刪除操作比vector要快,因為vector是順序存儲,而關聯容器是鏈式存儲;比list要慢,是因為即使它們同是鏈式結構,但list是線性的,而關聯容器是二叉樹結構,其改變一個元素涉及到其它元素的變動比list要多,并且它是排序的,每次插入和刪除都需要對元素重新排序;

2,關聯容器對元素的檢索操作比vector慢,但是比list要快很多。vector是順序的連續存儲,當然是比不上的,但相對鏈式的list要快很多是因為list是逐個搜索,它搜索的時間是跟容器的大小成正比,而關聯容器查找的復雜度基本是Log(N),比如如果有1000個記錄,最多查找10次,1,000,000個記錄,最多查找20次。容器越大,關聯容器相對list的優越性就越能體現;

3,在使用上set區別于vector,deque,list的最大特點就是set是內部排序的,這在查詢上雖然遜色于vector,但是卻大大的強于list。

4,在使用上map的功能是不可取代的,它保存了“鍵-值”關系的數據,而這種鍵值關系采用了類數組的方式。數組是用數字類型的下標來索引元素的位置,而map是用字符型關鍵字來索引元素的位置。在使用上map也提供了一種類數組操作的方式,即它可以通過下標來檢索數據,這是其他容器做不到的,當然也包括set。(STL中只有vector和map可以通過類數組的方式操作元素,即如同ele[1]方式)

容器適配器

STL中包含三種適配器:棧stack、隊列queue和優先級priority_queue。

適配器是容器的接口,它本身不能直接保存元素,它保存元素的機制是調用另一種順序容器去實現,即可以把適配器看作“它保存一個容器,這個容器再保存所有元素”。

STL中提供的三種適配器可以由某一種順序容器去實現。默認下stack和queue基于deque容器實現,priority_queue則基于vector容器實現。當然在創建一個適配器時也可以指定具體的實現容器,創建適配器時在第二個參數上指定具體的順序容器可以覆蓋適配器的默認實現。

由于適配器的特點,一個適配器不是可以由任一個順序容器都可以實現的。

棧stack的特點是后進先出,所以它關聯的基本容器可以是任意一種順序容器,因為這些容器類型結構都可以提供棧的操作有求,它們都提供了push_back、pop_back和back操作;

隊列queue的特點是先進先出,適配器要求其關聯的基礎容器必須提供pop_front操作,因此其不能建立在vector容器上;

優先級隊列priority_queue適配器要求提供隨機訪問功能,因此不能建立在list容器上。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 容器
    +關注

    關注

    0

    文章

    496

    瀏覽量

    22085
  • C++
    C++
    +關注

    關注

    22

    文章

    2113

    瀏覽量

    73738
  • STL
    STL
    +關注

    關注

    0

    文章

    86

    瀏覽量

    18341
  • 順序性容器
    +關注

    關注

    0

    文章

    2

    瀏覽量

    4814

原文標題:C++的容器

文章出處:【微信號:C_Expert,微信公眾號:C語言專家集中營】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C++語言入門教程之C++語言程序設計函數的詳細資料概述免費下載

    本文檔的主要內容詳細介紹的是C++語言入門教程之C++語言程序設計函數的詳細資料概述免費下載內容包括了:1 函數的定義和使用2 函數的參數傳遞3
    發表于 09-20 14:51 ?23次下載

    C++語言入門教程之C++語言程序設計數組的詳細資料概述免費下載

    本文檔的主要內容詳細介紹的是C++語言入門教程之C++語言程序設計數組的詳細資料概述免費下載內容包括了:1 一維數組 2 二維數組 3 字符
    發表于 09-20 14:51 ?9次下載
    <b class='flag-5'>C++</b>語言入門教程之<b class='flag-5'>C++</b>語言程序設計數組的<b class='flag-5'>詳細</b>資料概述免費下載

    C++入門教程之C++程序設計的課件資料免費下載

    本文檔的主要內容詳細介紹的是C++入門教程之C++程序設計的課件資料免費下載主要內容包括了:1. 認識C++2. C++的現狀和發展
    發表于 12-07 08:00 ?33次下載
    <b class='flag-5'>C++</b>入門教程之<b class='flag-5'>C++</b>程序設計的課件資料免費下載

    VISUAL C++教程之VISUAL C++的安裝和使用方法

    本文檔的主要內容詳細介紹的是VISUAL C++教程之VISUAL C++的安裝和使用方法資料免費下載。
    發表于 12-27 16:32 ?19次下載
    VISUAL <b class='flag-5'>C++</b>教程之VISUAL <b class='flag-5'>C++</b>的安裝和使用方法

    C++容器的使用代碼資料總結免費下載

    本文檔的主要內容詳細介紹的是C++容器的使用代碼資料總結免費下載。
    發表于 01-29 10:52 ?3次下載
    <b class='flag-5'>C++</b><b class='flag-5'>容器</b>的使用代碼資料總結免費下載

    C++的cast最完整最詳細的解釋資料說明

    本文檔的主要內容詳細介紹的是C++的cast最完整最詳細的解釋資料說明。
    發表于 01-29 15:26 ?0次下載
    <b class='flag-5'>C++</b>的cast最完整最<b class='flag-5'>詳細</b>的解釋資料說明

    Visual C++教程之C++的基礎知識介紹

    本文檔的主要內容詳細介紹的是Visual C++教程之C++的基礎知識介紹主要內容包括了:1 類和對象,2 類的成員及特性,3 繼承和派生類
    發表于 02-15 15:59 ?9次下載
    Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的基礎知識介紹

    C++程序設計教程之C++的初步知識的詳細資料說明

    C++程序設計教程之C++的初步知識的詳細資料說明包括了:1. 從CC++,2 . 最簡單的C++
    發表于 03-14 14:48 ?31次下載
    <b class='flag-5'>C++</b>程序設計教程之<b class='flag-5'>C++</b>的初步知識的<b class='flag-5'>詳細</b>資料說明

    C++程序設計教程之C++工具的詳細資料說明

    本文檔的詳細介紹的是C++程序設計教程之C++工具的詳細資料說明主要內容包括了:1. 異常處理,2. 命名空間,3. 使用早期的函數庫
    發表于 03-14 16:39 ?4次下載
    <b class='flag-5'>C++</b>程序設計教程之<b class='flag-5'>C++</b>工具的<b class='flag-5'>詳細</b>資料說明

    C++程序設計的基礎知識初步了解C++的資料免費下載

    本文檔的主要內容詳細介紹的是C++程序設計的基礎知識初步了解C++的資料免費下載包括了:1 認識C++,2 C++的現狀和發展,
    發表于 06-10 08:00 ?25次下載
    <b class='flag-5'>C++</b>程序設計的基礎知識初步了解<b class='flag-5'>C++</b>的資料免費下載

    圖文詳解:C++虛表的剖析

    圖文詳解:C++虛表的剖析
    的頭像 發表于 06-29 14:23 ?2555次閱讀
    圖文詳解:<b class='flag-5'>C++</b>虛表的<b class='flag-5'>剖析</b>

    C語言和C++的特點與用法詳細說明

    本文檔的主要內容詳細介紹的是C語言和C++的特點與用法詳細說明。
    的頭像 發表于 12-26 10:58 ?4440次閱讀

    C++學習筆記之順序容器

    C++中的順序容器是一用于存儲和管理元素序列的數據結構。它們提供了一組有序的元素,并支持在序列的任意位置插入和刪除元素。C++標準庫中提供了多種順序
    的頭像 發表于 05-11 17:05 ?625次閱讀

    C++入門之通用算法

    C++ 是一強大的編程語言,它提供了許多通用算法,可以用于各種容器類型。這些算法是通過迭代器來操作容器中的元素,因此它們是通用的,可以用于不同類型的
    的頭像 發表于 05-17 09:40 ?692次閱讀

    ?數組和C++ std::array詳解

    std::array是C++容器庫提供的一個固定大小數組的容器。其與內置的數組相比,是一更安全、更容易使用的數組類型。
    的頭像 發表于 07-19 11:02 ?1138次閱讀
    ?數組和<b class='flag-5'>C++</b> std::array詳解
    主站蜘蛛池模板: 日本免费大黄| 免费观看黄色网址| 亚洲特级毛片| 性free3d| 色男人的天堂| 男人都懂得网址| 国产综合色在线视频区色吧图片| 国产一级做a爰片久久毛片男| 国产精品热久久毛片| 一级特色黄大片| 免费鲁丝片一级观看| 97capcom超频在线| 日本欧洲亚洲一区在线观看| 伊人888| 日韩欧美中文字幕在线视频| 激情六月综合| 午夜影院性| 国产一级大片免费看| 一区二区三区网站| 亚洲亚洲人成网站在线观看| 日韩欧美中文在线| 国产三级国产精品| 天天天天天天天操| 免费啪视频在线观看免费的| www午夜| 日本三级香港三级人妇 m| 国产一级特黄a大片免费| 伊人黄| 91精品福利视频| 久久人人澡| 日韩欧美高清一区| 成人免费视频一区| 狼人 成人 综合 亚洲| 性做久久久久久久免费观看| 亚洲xxx视频| 久久综合综合久久| 天天搞天天操| 69日本xxⅹxxxxx18| 天堂-bt种子| 国产青草| 国产亚洲精品美女2020久久|