stl不同容器的優缺點
verctor
vector類似於c語言中的陣列,它維護一段連續的記憶體空間,具有固定的起始位址,因而能非常方便地進行隨機訪問,即 操作符,但因為它的記憶體區域是連續的,所以在它中間插入或刪除某個元素,需要複製並移動現有的元素。此外,當被插入的記憶體空間不夠時,需要重新申請一塊足夠大的記憶體並進行記憶體拷貝。值得注意的是,vector每次擴容為原來的兩倍,對小物件來說執行效率高,但如果遇到大物件,執行效率就低了。
list類似於c語言中的雙向鍊錶,它通過指標來進行資料的訪問,因此維護的記憶體空間可以不連續,這也非常有利於資料的隨機訪問,因而它沒有提供 操作符過載。
deque類似於c語言中的雙向佇列,即兩端都可以插入或者刪除的佇列。queue支援 操作符,也就是支援隨機訪問,而且跟vector的效率相差無幾。它支援兩端的操作:push_back,push_front,pop_back,pop_front等,並且在兩端操作上與list的效率
也差不多。或者我們可以這麼認為,deque是vector跟list的折中。
map類似於資料庫中的1:1關係,它是一種關聯容器,提供一對一的資料處理能力,這種特性了使得map類似於資料結構裡的紅黑二叉樹。
multimap類似於資料庫中的1:n關係,它是一種關聯容器,提供一對多的資料處理能力。
set類似於數學裡面的集合,不過set的集合中不包含重複的元素,這是和vector的第乙個區別,第二個區別是set內部用平衡二叉樹實現,便於元素查詢,而vector是使用連續記憶體儲存,便於隨機訪問。
multiset類似於數學裡面的集合,集合中可以包含重複的元素。
在實際使用過程中,到底選擇這幾種容器中的哪乙個,應該根據遵循以下原則:
1、如果需要高效的隨機訪問,不在乎插入和刪除的效率,使用vector;
2、如果需要大量的插入和刪除元素,不關心隨機訪問的效率,使用list;
3、如果需要隨機訪問,並且關心兩端資料的插入和刪除效率,使用deque;
4、如果打算儲存資料字典,並且要求方便地根據key找到value,一對一的情況使用map,一對多的情況使用multimap;
5、如果打算查詢乙個元素是否存在於某集合中,唯一存在的情況使用set,不唯一存在的情況使用multiset。
map:
map是stl的關聯容器,和set一樣 。每個節點內容是乙個pair,pair第一元素稱作「鍵值」,第二個稱作實值,它提供一對一的資料對映。特點是所有元素會根據鍵值自動被排序,因為底層資料結構採用紅黑樹。它是一種平衡二叉樹,可以對節點自動排序。並且map的各種操作介面,rb-tree都提供了,所以幾乎map所有操作都是轉呼叫rb-tree的操作。。
1.提供6個建構函式
map(); // 預設建構函式
map(const map& m) // 拷貝建構函式
map(iterator begin, iterator end ); //區間建構函式
map(iterator begin, iterator end, const traits& _compare) //帶比較謂詞的建構函式
map(iterator begin, iterator end, const traits& _compare, const allocator& all) //帶分配器
2.插入資料
mapmapstudent;
第一種:用insert函式插入pair資料,mapstudent.insert(pair(1,"student_one"));
第二種:用insert函式插入value_type資料,mapstudent.insert(map::value_type (1,"student_one"));
第三種:用陣列方式插入資料, mapstudent[1] = 「student_one」;
3. map的大小
使用size()函式
4. 資料的遍歷
第一種:應用前向迭代器,最常見
map::iterator iter;
for(iter = mapstudent.begin(); iter != mapstudent.end(); iter++)
第二種:應用反相迭代器,
map::reverse_iterator iter;
for(iter = mapstudent.rbegin(); iter != mapstudent.rend(); iter++)
第三種:用陣列方式
int nsize = mapstudent.size()
for(int nindex = 1; nindex <= nsize; nindex++)
5. 查詢
第一種:用count函式來判定關鍵字是否出現,其缺點是無法定位資料出現位置。其返回值只有兩個,要麼是0,要麼是1,出現返回1.
第二種:用find函式來定位資料出現位置,它返回的乙個迭代器,當資料出現時,它返回資料所在位置的迭代器,如果map中沒有要查詢的資料,它返回的迭代器等於end函式返回的迭代器
6. 清空與判空
清空map中的資料可以用clear()函式,判定map中是否有資料可以用empty()函式,它返回true則說明是空map
7.刪除
用迭代器刪除
用關鍵字刪除
成片的刪除
8.排序
STL容器效率比較
1 vector 變長一維陣列,連續存放的記憶體塊,有保留記憶體,堆中分配記憶體 支援操作,高效率的隨機訪問 在最後增加元素時,一般不需要分配記憶體空間,速度快 在中間或開始操作元素時要進行記憶體拷貝效率低 vector高效的原因在於配置了比其所容納的元素更多的記憶體,記憶體重新配置會花很多時間 注...
STL容器效率比較
1 vector 變長一維陣列,連續存放的記憶體塊,有保留記憶體,堆中分配記憶體 支援操作,高效率的隨機訪問 在最後增加元素時,一般不需要分配記憶體空間,速度快 在中間或開始操作元素時要進行記憶體拷貝效率低 vector高效的原因在於配置了比其所容納的元素更多的記憶體,記憶體重新配置會花很多時間 注...
STL 基本容器
1.順序容器與關聯容器 c 中有兩種型別的容器 順序容器和關聯容器,順序容器主要有 vector list deque等。其中vector表示一段連續的記憶體位址,基於陣列的實現,list表示非連續的記憶體,基於鍊錶實現。deque與vector類似,但是對於首元素提供刪除和插入的雙向支援。關聯容器...