C++ STL容器——序列式容器(array、vector、deque、list)
概述
1.C++ STL的容器分為三種,序列式容器,關聯式容器,無序式容器,這里先說說常用的序列式容器。
2.array,vector,deque,list,forward_list這幾種都是序列式容器,序列容器是以線性序列的方式存儲元素,也就是說,在內存,是連續分配一塊內存來存放元素的,是可以經過下標迭代的方式遍歷元素。
3.C++的容器是不能用來裝引用和函數的,容器的設計原則是以效率為先,安全為次的,所以容器本身并不帶有異常處理。
一.基本用法
所有的序列式容器都有一些共同的屬性和用法,這里我拿最學常用的std::vecot來舉例子,這些屬性array,vector,deque,list,forward_lis的使用方法是一樣的。
- 構造:
- 屬性:
二.std::array
1.概念
1.1 std::array是在C++11中才引入的容器,其實就是C++11對內置數組的重新封裝,array對象在實例化的時候大小是固定的,并不支持動態添加或者刪除元素,所以array默認是構造一個非空的實例。array的內存是分配在棧上的,對應的拷貝和賦值都要花掉一定的空間,絕不會重新分配內存。
1.2 在知道容器的大小情況,或者要與C進行交互時可以考慮使用std::array,畢竟array比內置的數組增加了一些常用的接口和可以對下標進行檢查。
2. std::array的構造:
3.std::array的元素訪問
遍歷方法:
5.交換函數:
t.swap(a);//交換兩個容器,array是交換兩個容器里面的值,而不是容器指針,這樣容器一大效率就會降低swap(t, a);//等價于上面三.std::vector
1.1 std::vector 是C++ 98就引入的動態數組,vector會在需要自動調整所占內存的大小,vector的這個特性讓它比起靜態數組所占用的內 存更多一些,因為它還分配了額外的內存以應對將來可能的內存擴張,在使用過程中,不用因為每次插入新的元素而重新分配內存,除非預留分配的那塊內存用完,這樣有效率會有很大的提升。
1.2 std::vector的特點是能隨機訪問容器內的元素,在容器末端添加或者刪除元素效率比較高,前端和中間則效率相對會低一些。
四.std::deque
1.概念
1.1 std::deque是雙端隊列,頭尾兩端插入和刪除元素比較高效,中間刪除和添加元素效率低,在std::deque兩端插入和刪除并不會使其它元素的指針或引用失效。
1.2 元素的訪問和迭代比vector慢,因為迭代器是智能指針而不是普通指針,內存分配不連續。
1.3 std::deque的存儲空間會自動按需擴大和縮小,擴大std::deque比擴大std::vector的效率和開銷會低很多,因為它不涉及到現有元素復制到新的內存位置。
2.定義方法和定義vecot的方法一樣,沒有不一樣的地方。
3.屬性
std::deque不提供 capacity(),reserve()這兩個方法,因為deque分配的內存是一塊一塊的,不需要知道預分配多少內存。
4.元素訪問與容器遍歷與vector一樣。
5.deque不能和C接口交互。
6.交換兩個容器方法和效率跟vector一樣。
五.std::list
1.概述
1.1 list是一個雙向鏈表,不支持隨機訪問元素,訪問頭部和尾部元素速度快。
1.2 在list中任何位置進行插入/刪除操作速度都很快,常量時間內完成,插入和刪除不會造成迭代器失效。
1.3 對異常支持較好,出現異常對list而言,要么成功,要么什么影響都沒有。
1.4 list在空間的成本上要比vector,deque高很多,因為list是一個雙向列表,每個元素要有一個往前指針和往后的指針,list本身內部的元素是通過new的方式來生成的,比如用list存一個char元素時,在64位系統下,要開支33個字節左右(往前指針8個字節 + 往后指針8個字+new的16個字節 + char本身的一個字節)。
2.構造方法與vector一樣。
3.屬性。
list是一個個分配內存的,所以不提供capacity(),reserve(),shrink_to_fit() 這三個方法。
4.元素訪問與遍歷
list不支持[]和at訪問元素。
5.算法
d.remove(1.2);//刪除掉容器里面所有等于1.2的值d.remove_if([](auto v) {return v > 5.0f; });//條件刪除d.reverse();//翻轉整個容器d.sort();//排序,默認是從小到大//std::sort(d.begin(), d.end());//不能這么用h.sort();d.merge(h);//把兩個排好序的容器合并成一個容器,之后h里面沒有元素d.unique();//把兩個排好序的容器里面重復的元素刪掉d.splice(d.begin(),c);//把C容器安插到d的指定位置5.list不能和C接口交互。
總結
以上是生活随笔為你收集整理的C++ STL容器——序列式容器(array、vector、deque、list)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: YOLOX——Win10下训练自定义VO
- 下一篇: Android NDK开发——Andro