c++ 容器類 概括性介紹
2009-05-17 20:48
c++中的容器類包括「順序儲存結構」和「關聯儲存結構」,前者包括vector,list,deque等;後者包括set,map,multiset,multimap等。
若需要儲存的元素數在編譯器間就可以確定,可以使用陣列來儲存,否則,就需要用到容器類了。
1、vector
連續儲存結構,每個元素是在記憶體上是連續的;
支援高效的隨機訪問和在尾端插入/刪除操作,但其他位置的插入/刪除操作效率低下;
2、deque
連續儲存結構,即其每個元素在記憶體上也是連續的,類似於vector,不同之處在於,deque提供了兩級陣列結構,第一級完全類似於vector,代表實際容器;另一級維護容器的首位位址。
這樣,deque除了具有vector的所有功能外,還支援高效的首端插入/刪除操作。
3、list
非連續儲存結構,具有雙鏈表結構,每個元素維護一對前向和後向指標,因此支援前向/後向遍歷。
支援高效的隨機插入/刪除操作,但隨機訪問效率低下,且由於需要額外維護指標,開銷也比較大。
4、vector v.s. list v.s. deque:
a、若需要隨機訪問操作,則選擇vector;
b、若已經知道需要儲存元素的數目, 則選擇vector;
c、若需要隨機插入/刪除(不僅僅在兩端),則選擇list
d、只有需要在首端進行插入/刪除操作的時候,才選擇deque,否則都選擇vector。
e、若既需要隨機插入/刪除,又需要隨機訪問,則需要在vector與list間做個折中。
f、當要儲存的是大型負責類物件時,list要優於vector;當然這時候也可以用vector來儲存指向物件的指標,同樣會取得較高的效率,但是指標的維護非常容易出錯,因此不推薦使用。
5、capacity v.s size
a、capacity是容器需要增長之前,能夠盛的元素總數;只有連續儲存的容器才有capacity的概念(例如vector,deque,string),list不需要capacity。
b、size是容器當前儲存的元素的數目。
c、vector預設的容量初始值,以及增長規則是依賴於編譯器的。
6、用vector儲存自定義類物件時,自定義類物件須滿足:
a、有可供呼叫的無參建構函式(預設的或自定義的);
b、有可用的拷貝賦值函式(預設的或自定義的)
7、迭代器iterator
a、vector與deque的迭代器支援算術運算,list的迭代器只能進行++/--操作,不支援普通的算術運算。
以下為整個列表概述:
標準容器類
說明順序性容器
vector
從後面快速的插入與刪除,直接訪問任何元素
deque
從前面或後面快速的插入與刪除,直接訪問任何元素
list
雙鏈表,從任何地方快速插入與刪除
關聯容器
set快速查詢,不允許重複值
multiset
快速查詢,允許重複值
map一對多對映,基於關鍵字快速查詢,不允許重複值
multimap
一對多對映,基於關鍵字快速查詢,允許重複值
容器介面卡
stack
後進先出
queue
先進先出
priority_queue
最高優先順序元素總是第乙個出列
所有標準庫共有函式
預設建構函式
提供容器預設初始化的建構函式。
複製建構函式
將容器初始化為現有同類容器副本的建構函式
析構函式
不再需要容器時進行記憶體整理的析構函式
empty
容器中沒有元素時返回true,否則返回false
max_size
返回容器中最大元素個數
size
返回容器中當前元素個數
operator=
將乙個容器賦給另乙個容器
operator<
如果第乙個容器小於第二個容器,返回true,否則返回false,
operator<=
如果第乙個容器小於或等於第二個容器,返回true,否則返回false
operator>
如果第乙個容器大於第二個容器,返回true,否則返回false
operator>=
如果第乙個容器大於或等於第二個容器,返回true,否則返回false
operator==
如果第乙個容器等於第二個容器,返回true,否則返回false
operator!=
如果第乙個容器不等於第二個容器,返回true,否則返回false
swap
交換兩個容器的元素
其中operator>,operator>=,operator<,operator<=,operator==,operator!=均不適用於priority_queue
順序容器和關聯容器共有函式
begin
該函式兩個版本返回iterator或const_iterator,引用容器第乙個元素
end該函式兩個版本返回iterator或const_iterator,引用容器最後乙個元素後面一位
rbegin
該函式兩個版本返回reverse_iterator或const_reverse_iterator,引用容器最後乙個元素
rend
該函式兩個版本返回reverse_iterator或const_reverse_iterator,引用容器第乙個元素前面一位
erase
從容器中清除乙個或幾個元素
clear
清除容器中所有元素
下表顯示了順序容器和關聯容器中常用的typedef,這些typedef常用於變數、引數和函式返回值的一般性宣告。
value_type
容器中存放元素的型別
reference
容器中存放元素型別的引用
const_reference
容器中存放元素型別的常量引用,這種引用只能讀取容器中的元素和進行const操作
pointer
容器中存放元素型別的指標
iterator
指向容器中存放元素型別的迭代器
const_iterator
指向容器中存放元素型別的常量迭代器,只能讀取容器中的元素
reverse_iterator
指向容器中存放元素型別的逆向迭代器,這種迭代器在容器中逆向迭代
const_reverse_iterator
指向容器中存放元素型別的逆向迭代器,只能讀取容器中的元素
difference_type
引用相同容器的兩個迭代器相減結果的型別(list和關聯容器沒有定義operator-)
size_type
用於計算容器中專案數和檢索順序容器的型別(不能對list檢索)
三、序列類容器
vector
向量 相當於乙個陣列
在記憶體中分配一塊連續的記憶體空間進行儲存。支援不指定vector大小的儲存。stl內部實現時,首先分配乙個非常大的記憶體空間預備進行儲存,即capacituy()函式返回的大小,當超過此分配的空間時再整體重新放分配一塊記憶體儲存,這給人以vector可以不指定vector即乙個連續記憶體的大小的感覺。通常此預設的記憶體分配能完成大部分情況下的儲存。
優點:(1) 不指定一塊記憶體大小的陣列的連續儲存,即可以像陣列一樣操作,但可以對此陣列
進行動態操作。通常體現在push_back() pop_back()
(2) 隨機訪問方便,即支援[ ]操作符和vector.at()
(3) 節省空間。
缺點:(1) 在內部進行插入刪除操作效率低。
(2) 只能在vector的最後進行push和pop,不能在vector的頭進行push和pop。
(3) 當動態新增的資料超過vector預設分配的大小時要進行整體的重新分配、拷貝與釋
放2 list
雙向鍊錶
每乙個結點都包括乙個資訊快info、乙個前驅指標pre、乙個後驅指標post。可以不分配必須的記憶體大小方便的進行新增和刪除操作。使用的是非連續的記憶體空間進行儲存。
優點:(1) 不使用連續記憶體完成動態操作。
(2) 在內部方便的進行插入和刪除操作
(3) 可在兩端進行push、pop
缺點:(1) 不能進行內部的隨機訪問,即不支援[ ]操作符和vector.at()
(2) 相對於verctor占用記憶體多
3 deque
雙端佇列 double-end queue
deque是在功能上合併了vector和list。
優點:(1) 隨機訪問方便,即支援[ ]操作符和vector.at()
(2) 在內部方便的進行插入和刪除操作
(3) 可在兩端進行push、pop
缺點:(1) 占用記憶體多
使用區別:
1 如果你需要高效的隨即訪問,而不在乎插入和刪除的效率,使用vector
2 如果你需要大量的插入和刪除,而不關心隨即訪問,則應使用list
3 如果你需要隨即訪問,而且關心兩端資料的插入和刪除,則應使用deque
重溫統計學 python實現概括性度量
匯入所需的包 import pandas as pd import numpy as np import seaborn as sns from scipy import stats 讀取資料,並用describe檢視資料的分布情況 data pd.read excel desktop 實踐一.xl...
Python統計學一資料的概括性度量
統計學是應用數學的乙個分支,主要通過利用概率論建立數學模型,收集所觀察系統的資料,進行量化的分析 總結,並進而進行推斷和 為相關決策提供依據和參考。統計學主要又分為 描述統計學 和推斷統計學 給定一組資料,統計學可以摘要並且描述這份資料,這個用法稱作為描述統計學。另外,觀察者以資料的形態建立出乙個用...
統計學 第四章 資料的概括性度量
一 集中趨勢的度量 集中趨勢是指一組資料向某一中心值靠攏的程度,它反映了一組資料中心點的位置所在。1.分類資料 眾數 1 概念 眾數是一組資料 現次數最多的變數值,用m。表示。2.順序資料 中位數和分位數 中位數是一組資料排列後處於中間位置上的變數值,用me表示。主要用於測量順序資料的集中趨勢,也適...