1. 程式人生 > >《C++程式設計語言》學習筆記1-容器

《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];
}