map、unordered_map、set 和 unordered_set的小介绍

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

posted @ 2024-11-18 19:17  hisun9  阅读(13)  评论(0编辑  收藏  举报