map、unordered_map、set 和 unordered_set的小介紹

hisun9發表於2024-11-18

1. map

  • 簡介:

    map 是 C++ STL 中的關聯容器,儲存鍵值對(key-value pair),所有元素按 鍵值升序(或自定義排序)儲存。

  • 主要特性:

    1. 底層實現:使用 紅黑樹 實現,提供了自動排序功能。

    2. 元素有序:插入元素後,按鍵值排序。

    3. 時間複雜度:插入、刪除、查詢:O(logn)(因為樹的深度為 O(logn) )。

    4. 記憶體佔用:較小(相比 unordered_map,紅黑樹的實現比雜湊表節省記憶體)。

    5. 迭代器:提供雙向迭代器,支援正向和反向遍歷。

  • 常見用法:

    • 儲存有序鍵值對。

    • 查詢某個範圍內的鍵值。

  • 舉一個例子

    #include <map>
    #include <iostream>
    using namespace std;
    
    int main() {
        map<int, string> m;
        m[3] = "C";
        m[1] = "A";
        m[2] = "B";
    
        // 遍歷輸出
        cout << "map contents:\n";
        for (auto it : m) {
            cout << it.first << ": " << it.second << endl;
        }
    
        // 查詢
        auto it = m.find(2); // 返回指向鍵為2的迭代器
        if (it != m.end()) {
            cout << "Found key 2: " << it->second << endl;
        }
    }
    

    輸出如下:

    img

2. unordered_map

  • 簡介:

    unordered_map 是 C++ STL 中的無序關聯容器,用於儲存鍵值對。其底層實現是 雜湊表。

  • 主要特性:

    1. 底層實現:

    2. 使用雜湊表,元素儲存位置基於鍵的雜湊值。

    3. 元素無序:元素儲存順序與插入順序、鍵值大小無關。

    4. 時間複雜度:插入、刪除、查詢:平均 O(1),最壞 𝑂(𝑛)(當發生雜湊衝突時)。

    5. 記憶體佔用:較大(因為雜湊表需要額外的儲存空間)。

    6. 迭代器:提供單向迭代器,不支援反向遍歷。

  • 常見用法:

    • 快速查詢鍵值對。

    • 當資料無序性無關緊要時使用。

  • 舉一個例子

    #include <unordered_map>
    #include <iostream>
    using namespace std;
    
    int main() {
        unordered_map<string, int> umap;
        umap["apple"] = 5;
        umap["banana"] = 2;
        umap["cherry"] = 7;
    
        // 遍歷輸出
        cout << "unordered_map contents:\n";
        for (auto it : umap) {
            cout << it.first << ": " << it.second << endl;
        }
    
        // 查詢
        if (umap.find("banana") != umap.end()) {
            cout << "Found banana with count: " << umap["banana"] << endl;
        }
    }
    

    輸出如下:

    img

3. set

  • 簡介:

    set 是一種有序集合,儲存 唯一元素,並按 升序(或自定義排序) 排列。

  • 主要特性:

    1. 底層實現:使用紅黑樹。

    2. 元素有序:元素按順序儲存,支援範圍查詢。

    3. 時間複雜度:插入、刪除、查詢:O(logn)。

    4. 迭代器:提供雙向迭代器,支援正向和反向遍歷。

  • 常見用法:

    • 儲存需要唯一的有序集合。

    • 執行區間查詢。

  • 舉一個例子

    #include <set>
    #include <iostream>
    using namespace std;
    
    int main() {
        set<int> s = {3, 1, 4, 1, 5}; // 重複的1會被自動去除
        s.insert(2);
    
        // 遍歷輸出
        cout << "set contents:\n";
        for (auto it : s) {
            cout << it << " ";
        }
    
        // 查詢
        if (s.find(4) != s.end()) {
            cout << "\nFound 4 in set.";
        }
    }
    

    輸出如下:

    img

4. unordered_set

  • 簡介:
    unordered_set 是一種無序集合,儲存 唯一元素,其底層實現是雜湊表。

  • 主要特性:

    1. 底層實現:使用雜湊表。

    2. 元素無序:元素儲存位置與插入順序無關。

    3. 時間複雜度:插入、刪除、查詢:平均 O(1),最壞 O(n)。

    4. 迭代器:提供單向迭代器,不支援反向遍歷。

  • 常見用法:

    • 儲存需要唯一的無序集合。

    • 僅關心元素的存在性或快速查詢。

  • 舉一個例子

    #include <unordered_set>
    #include <iostream>
    using namespace std;
    
    int main() {
        unordered_set<int> uset = {3, 1, 4, 1, 5};
        uset.insert(2);
    
        // 遍歷輸出
        cout << "unordered_set contents:\n";
        for (auto it : uset) {
            cout << it << " ";
        }
    
        // 查詢
        if (uset.find(4) != uset.end()) {
            cout << "\nFound 4 in unordered_set.";
        }
    }
    

    輸出如下:

    img

相關文章