《C++程式設計語言》學習筆記1-容器
容器
容器名 | 資料結構 |
---|---|
vector<T> | 可變大小向量 |
list<T> | 雙向連結串列 |
forward_list<T> | 單向連結串列 |
deque<T> | 雙端佇列 |
set<T> | 集合 |
multiset<T> | 允許重複值的集合 |
map<K,V> | 關聯陣列 |
multimap<K,V> | 允許重複關鍵字的map |
unordered_map<K,V> | 採用雜湊搜尋的map |
unordered_multimap<K,V> | 採用雜湊搜尋的multimap |
unordered_set<T> | 採用雜湊搜尋的set |
unordered_multiset<T> | 採用雜湊搜搜的multiset |
一、vector
1.一個vector就是一個給定型別元素的序列,元素在記憶體中是連續儲存的 2.用一組值來初始化vector(值的型別必須與vector元素型別符合)
//Entry代表“電話簿”結構體,包含string型名字,int型號碼 vector<Entry> phone_book = { {"David Hume",123456}, {"Karl Poper",234567}, {"Bertrand Arthur William Russell",345678} };
可以通過下標運算子訪問元素,如phone_book[0] 可以返回元素的數目,如phone_book.size() 遍歷vector元素,for(const auto& x : phone_book) 定義vector時可設定初始大小:
vector<int> v1 = {1, 2, 3,4}; //size為4 vector<string> v2; //size為0 vector<Shape> v3(23); //顯示給出size為23;元素初值是nulptr vector<double> v4(32, 9.9); //顯示size為32,元素初值是9.9(32個元素全部初始為9.9)
vector的初始大小隨著程式的執行可以被改變 在賦值和初始化時,vector可以被拷貝,如vector book2 = phone_book; 拷貝和移動vector是通過建構函式和賦值運算子實現的,vector的賦值過程包括拷貝其中的元素 4.方法1:vector.push_back(),它向vector末尾追加一個新元素 5.元素 vector<T>中,元素T可為:內建資料型別(char、int、double)、使用者自定義型別(string、Entry、list、Matrix<double,2>)、指標型別 6.範圍檢查 標準庫vector不進行範圍檢查(可能越界),可以自定義範圍檢查
二、list
1.list是一個雙向連結串列 如果希望在一個序列中新增和刪除元素的同時無須移動其他元素,則應使用list,電話簿插入刪除頻繁可使用list
//Entry代表“電話簿”結構體,包含string型名字name,int型號碼number
list<Entry> phone_book = {
{"David Hume",123456},
{"Karl Poper",234567},
{"Bertrand Arthur William Russell",345678}
};
2.一般不用下標操作來訪問連結串列元素 3.遍歷連結串列list,for(const auto& x : phone_book):
int get_number(const string& s){
for(const auto& x : phone_book)
if(x.name == s)
return x.number;
return 0;
}
每個標準庫容器都提供begin()和end()函式,顯示地使用迭代器遍歷list(p為指標)
int get_number(const string& s){
for(auto p=phone_book.begin();p!=phone_book.end();++p)
if(p->name == s)
return p->number;
return 0;
}
4.方法1,新增元素:
phone_book.insert(p,ee); //將ee新增到p指向的元素之前
5.方法2,刪除元素:
phone_book.erase(q); //刪除q指向的元素
6.當只需要一個元素序列,資料量較小時,應該使用vector(vector無論遍歷如find()和count()、排序sort()、搜尋binary_search()都優於list)
三、map
1.map是一個搜尋樹(紅黑樹),也稱為關聯陣列或字典,通常用平衡二叉樹實現
//map是值對的容器,(key,value)
map<string,int> phone_book {
{"David Hume",123456},
{"Karl Poper",234567},
{"Bertrand Arthur William Russell",345678}
};
2.map支援下標操作(本質上是一次搜尋),下標值應為map的第一個型別key,得到與關鍵字關聯的值value,若key值不存在則向map插入一個新元素,複雜度O(log(n))
int get_number(const string& s){
return phone_book[s];
}
四、unordered_map 無序容器
1.初始化
unordered_map<string,int> phone_book {
{"David Hume",123456},
{"Karl Poper",234567},
{"Bertrand Arthur William Russell",345678}
};
2.下標操作
int get_number(const string& s){
return phone_book[s];
}