現代C++教程:高速上手(四)-容器
阿新 • • 發佈:2020-09-20
## 1、線性容器
std::array與std::vector不同的是,array物件的大小是固定的,如果容器大小是固定的,那麼可以優先考慮使用std::array容器。
由於std::vector是自動擴容的,當存入大量的資料後,並且對容器進行了刪除操作,容器並不會自動歸還被刪除元素相應的記憶體,這時候需要手動執行shrink_to_fit()釋放這部分記憶體。
std::array C風格介面傳參:
```cpp
void foo(int *p, int len){
return;
}
std::array arr = {1,2,3,4};
//foo(arr,arr.size()); //非法,無法隱式轉換
foo(&arr[0], arr.size());
foo(arr.data(), arr.size());
//使用std::sort
std::sort(arr.begin(), arr.end());
//升序
std::sort(arr.begin(), arr.end(), [](int a, int b){
return b > a;
})
```
std::forward_list是一個列表容器,使用方法和std::list基本類似。和list的雙向連結串列的實現不同,forward_list使用單向連結串列進行實現,提供了O(1)複雜度的元素插入,不支援快速隨機訪問,也是標準庫容器中唯一一個不提供size()方法的容器。當不需要雙向迭代時,具有比list更高的空間利用率。
## 2、無序容器
傳統c++中的有序容器 std::map / std::set,這些元素內部通過紅黑樹進行實現,插入和搜尋的平均複雜度均為O(log(size))。在插入元素時,會根據<操作符比較元素大小並判斷元素是否相同,並選擇合適的位置插入到容器中。當對這個容器中的元素進行遍歷時,輸出結果會按照<操作符的順序來逐個遍歷。
而無序容器中的元素是不進行排序的,內部通過Hash表實現,插入和搜尋元素的平均複雜度為O(constant),在不關心容器內部元素順序時,能夠獲得顯著的效能提升。
c++11引入了兩組無序容器:std::unordered_map / std::unordered_multimap和std::unordered_set / std::unordered_multiset。
它們的用法和原有的std::map / std::multimap / std::set / std::multiset基本類似。
```cpp
#include
#include
#include
#include