C++:多种map的定义及用法

1. std::map

  • 实现std::map 使用自平衡的二叉搜索树(通常是红黑树)来存储元素。
  • 特点
    • 有序:元素按照键的顺序自动排序。
    • 键唯一性:每个键在 std::map 中是唯一的。
    • 复杂度:插入、删除和查找操作的时间复杂度为对数时间(O(log N))。
    • 默认哈希函数std::map 使用键的 < 运算符进行比较。

示例代码

#include <iostream>
#include <map>
#include <string>

int main() {
    // 创建一个 std::map 对象,键为 std::string,值为 int
    std::map<std::string, int> mmap;

    // 插入键值对
    mmap["apple"] = 3;
    mmap["banana"] = 2;
    mmap["cherry"] = 5;

    // 查找键 "banana" 并打印对应的值
    auto search = mmap.find("banana");
    if (search != mmap.end()) {
        std::cout << "Found banana with value: " << search->second << std::endl;
    } else {
        std::cout << "Banana not found!" << std::endl;
    }

    // 遍历 std::map 并打印所有键值对
    for (const auto& pair : mmap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    // 删除键 "apple"
    mmap.erase("apple");

    return 0;
}

2. std::multimap

  • 实现std::multimapstd::map 类似,但允许键重复。它同样使用自平衡的二叉搜索树(通常是红黑树)来存储元素。
  • 特点
    • 有序:元素按照键的顺序自动排序。
    • 键允许重复:一个键可以有多个值。
    • 复杂度:插入、删除和查找操作的时间复杂度为对数时间(O(log N))。

示例代码

#include <iostream>
#include <map>
#include <string>

int main() {
    // 创建一个 std::multimap 对象,键为 std::string,值为 int
    std::multimap<std::string, int> mmap;

    // 插入键值对
    mmap.insert({"apple", 3});
    mmap.insert({"banana", 2});
    mmap.insert({"apple", 4});  // 允许重复的键

    // 查找键 "apple" 并打印对应的所有值
    auto range = mmap.equal_range("apple");
    for (auto it = range.first; it != range.second; ++it) {
        std::cout << "Apple value: " << it->second << std::endl;
    }

    // 遍历 std::multimap 并打印所有键值对
    for (const auto& pair : mmap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    // 删除键 "apple"
    mmap.erase("apple");

    return 0;
}

3. std::unordered_map

  • 哈希表实现

    • unordered_map 使用哈希表来实现数据存储。哈希表通过哈希函数将键映射到哈希表的桶中,从而实现常数时间复杂度的平均插入、删除和查找操作。
  • 无序存储

    • std::map 不同,unordered_map 不会按照键的顺序来存储元素,而是根据哈希值来组织桶。因此,它的元素顺序是不确定的。
  • 键唯一性

    • 每个键在 unordered_map 中是唯一的。如果插入一个已有键的键值对,旧的值会被新值替换。
  • 自定义哈希函数和比较函数

    • unordered_map 允许用户定义自己的哈希函数和键比较函数,以便用于特定类型的键。默认情况下,它使用 std::hash 作为哈希函数,使用 std::equal_to 作为比较函数。

示例代码

#include <iostream>
#include <unordered_map>
#include <string>

int main() {
    // 创建一个 unordered_map 对象,键为 std::string,值为 int
    std::unordered_map<std::string, int> umap;

    // 插入键值对
    umap["apple"] = 3;
    umap["banana"] = 2;
    umap["cherry"] = 5;

    // 查找键 "banana" 并打印对应的值
    auto search = umap.find("banana");
    if (search != umap.end()) {
        std::cout << "Found banana with value: " << search->second << std::endl;
    } else {
        std::cout << "Banana not found!" << std::endl;
    }

    // 遍历 unordered_map 并打印所有键值对
    for (const auto& pair : umap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    // 删除键 "apple"
    umap.erase("apple");

    return 0;
}

4. std::unordered_multimap

  • 实现std::unordered_multimap 使用哈希表来存储元素,允许键重复。
  • 特点
    • 无序:元素的顺序是不可预测的。
    • 键允许重复:一个键可以有多个值。
    • 复杂度:在理想情况下,插入、删除和查找操作的时间复杂度为常数时间(O(1)),但在最坏情况下可能退化为线性时间(O(N))。
    • 哈希函数std::unordered_multimap 使用哈希函数来确定键的存储位置,默认使用 std::hash,但可以自定义哈希函数。

示例代码

#include <iostream>
#include <unordered_map>
#include <string>

int main() {
    // 创建一个 std::unordered_multimap 对象,键为 std::string,值为 int
    std::unordered_multimap<std::string, int> ummap;

    // 插入键值对
    ummap.insert({"apple", 3});
    ummap.insert({"banana", 2});
    ummap.insert({"apple", 4});  // 允许重复的键

    // 查找键 "apple" 并打印对应的所有值
    auto range = ummap.equal_range("apple");
    for (auto it = range.first; it != range.second; ++it) {
        std::cout << "Apple value: " << it->second << std::endl;
    }

    // 遍历 std::unordered_multimap 并打印所有键值对
    for (const auto& pair : ummap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    // 删除键 "apple"
    ummap.erase("apple");

    return 0;
}

总结

  • std::map:有序的键值对容器,基于红黑树实现。
  • std::multimap:有序的键值对容器,允许键重复,基于红黑树实现。
  • std::unordered_map:无序的键值对容器,基于哈希表实现。
  • std::unordered_multimap:无序的键值对容器,允许键重复,基于哈希表实现。

每种 map 类型都有其特定的用途和优缺点,可以根据具体的需求和性能要求来选择合适的容器。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
std::mapC++ 标准库中的关联容器,它提供了一种键值对的映射关系,并且会按照键的字典序自动排序。可以使用该容器实现字典、统计词频等功能。 使用 std::map 需要包含头文件 <map>,其中定义了该容器的类模板。定义一个 std::map 可以使用以下语法: ```c++ std::map<Key, Value> map_name; ``` 其中,Key 和 Value 分别指定了键和值的类型。例如,定义一个键为字符串,值为整数的 std::map 可以使用以下语句: ```c++ std::map<std::string, int> word_count; ``` 使用 std::map 插入元素可以使用 insert() 函数,删除元素可以使用 erase() 函数。查询元素可以使用 [] 运算符或者 find() 函数。例如,插入一个键值对可以使用以下语句: ```c++ word_count.insert(std::pair<std::string, int>("hello", 1)); ``` 使用 [] 运算符可以直接访问一个键对应的值,例如: ```c++ int count = word_count["hello"]; ``` 如果键不存在,则会自动插入一个新的键值对,值为默认值。使用 find() 函数可以查找一个键对应的迭代器,例如: ```c++ std::map<std::string, int>::iterator it = word_count.find("hello"); if (it != word_count.end()) { int count = it->second; } ``` 以上就是 std::map 的基本用法。需要注意的是,std::map 内部实现使用红黑树,插入、删除、查询的时间复杂度都是 O(log n),但是相比于 std::unordered_map,std::map 具有自动排序的特性,因此更适合于需要按照键的顺序访问元素的场合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值