STL這部分推薦直接看《C++ primer》的9到11章內容,有非常詳細的介面串列,還有很多例子,附錄里還有常用的泛型演算法,適合經常看一下


vector容器
底層資料結構:動態開辟的陣列,每次以原來空間大小的2倍進行擴容的
vector<int> vec;

deque雙端佇列和list鏈表
初始的元素放在佇列的中間,方便后續添加元素,外部有一個mapper保存佇列,隊滿的時候會對mapper擴容,佇列放在擴容后的mapper的sizeof(原來mapper)/2的位置,
deque容器:
list容器:

vector、deque、list對比
vecotr和deque之間的區別?
- deque底層記憶體是否是連續的? 不是,deque是由一個二維陣列構成的,每一個第二維是連續的,第一維資料不是連續的,
- 前中后插入洗掉的時間復雜度:中間和末尾是O(1),前面插入deque是O(1),vector是O(n)
- 對于記憶體的使用效率: vector的低,需要的記憶體空間必須是連續的,deque可以分塊進行存盤,不需要記憶體空間必須是連續的,
- 由于deque的第二維記憶體空間不是連續的,所以在deuqe中間進行元素的insert或者erase,造成元素移動的時候臂vector要慢
vector和list之間的區別?
- list底層是雙向回圈鏈表
- list的增加洗掉是O(1),vector增加洗掉是O(n)
詳解容器配接器


無序關聯容器
unordered_set:

unordered_map:
map的operator[]多載有兩個功能:一是查詢,二如果key不存在,會插入一對資料
unordered_map<int,string> mp1;
mp1.insert(make_pair(12,"asf"));//生成pair型別
mp1.insert({123,"asfsaf"});

有序關聯容器
底層是紅黑樹結構,
自定義型別如何在有序容器中排序:要在自定義型別中提供小于運算子的多載
容器的迭代器

函式物件
函式物件就是C語言里的函式指標
把有operator()小括號運算子多載函式的物件,稱作函式物件或者稱作仿函式,

好處:
- 通過函式物件呼叫operator(),可以省略函式的呼叫開銷,比通過函式指標呼叫函式(不能夠inline行內呼叫)效率高,
- 因為函式物件使用類生成的,所以可以添加相關的成員變數,用來記錄函式物件使用時的更多的資訊,
template<typename T>
bool mygreater(T a, T b) {
return a > b;
}
template<typename T>
bool myless(T a, T b) {
return a < b;
}
template<typename T>
class Myless{//函式物件
public:
bool operator()(T a,T b){
return a<b;
}
};
template<typename T, typename Compare>
bool compare(T a, T b, Compare comp) {//使用函式指標或者函式物件呼叫前面定義的兩個函式
return comp(a, b);//在使用函式指標的時候無法宣告為inline函式,效率低
}
int main() {
cout << compare(10, 30, mygreater<int>)<<endl;
cout<<compare(20,10,Myless<int>())<<endl;
return 0;
}
函式物件的一些其他用法:用于priority_queue和set:
priority_queue<int,vector<int>,Mygreater<int>> queue1;
priority_queue<int> queue2;
for(int i=0;i<20;i++){
queue1.push(rand()%100);
queue2.push(rand()%100);
}
for(int i=0;i<20;i++){
cout<<queue1.top()<<" ";
queue1.pop();
}
cout<<endl;
for(int i=0;i<20;i++){
cout<<queue2.top()<<" ";
queue2.pop();
}
cout<<endl;
/* 輸出結果:
2 5 18 21 27 34 35 41 47 61 62 67 69 69 71 78 81 91 92 95
99 95 94 91 82 67 64 58 53 45 42 38 36 27 26 24 16 12 4 0*/
//set:
set<int> set1;
set<int,Mygreater<int>> set2;
for(int i=0;i<20;i++){
set1.insert(rand()%100);
set2.insert(rand()%100);
}
for(int a:set1){
cout<<a<<" ";
}
cout<<endl;
for(int a:set2){
cout<<a<<" ";
}
cout<<endl;
/* 輸出結果
3 6 16 22 23 29 37 40 41 46 47 53 62 64 70 73 88 90 93
78 68 64 59 57 50 48 44 42 41 35 33 29 11 6 5 1*/
泛型演算法和系結器



轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/479955.html
標籤:其他
上一篇:Spring Boot + Mybatis Plus + ClickHouse 輕松實作增刪改查,看了必懂。。
下一篇:根據字串提取路徑名
