在C++中,unordered系列是STL(标准模板库)中一个非常重要的部分,主要用于存储和管理数据。它们提供了一种HASH表的实现,支持快速的插入、删除和查找操作,这些操作的时间复杂度平均为O(1)。C++标准库中的unordered系列主要包括unordered_mapunordered_setunordered_multimapunordered_multiset

1. unordered_map

unordered_map是一种基于键值对的数据结构,其中每个键都是唯一的,存储和访问效率极高。我们可以将其视作一个哈希表。

示例代码:

#include <iostream>
#include <unordered_map>

int main() {
    // 定义一个unordered_map
    std::unordered_map<std::string, int> ageMap;

    // 插入元素
    ageMap["Alice"] = 25;
    ageMap["Bob"] = 30;
    ageMap["Charlie"] = 35;

    // 查找元素
    std::string name = "Alice";
    if (ageMap.find(name) != ageMap.end()) {
        std::cout << name << "的年龄是: " << ageMap[name] << std::endl;
    } else {
        std::cout << name << "未找到" << std::endl;
    }

    // 删除元素
    ageMap.erase("Bob");

    // 遍历unordered_map
    for (const auto& pair : ageMap) {
        std::cout << "姓名: " << pair.first << ", 年龄: " << pair.second << std::endl;
    }

    return 0;
}

在这个示例中,我们创建了一个unordered_map来存储人的姓名和年龄。通过简单的插入、查找和遍历操作,我们可以看到unordered_map的高效性。

2. unordered_set

unordered_set是一个不允许重复元素的集合,它同样基于哈希表实现,适用于需要快速查找唯一元素的场景。

示例代码:

#include <iostream>
#include <unordered_set>

int main() {
    // 定义一个unordered_set
    std::unordered_set<int> numbers;

    // 插入元素
    numbers.insert(1);
    numbers.insert(2);
    numbers.insert(3);
    numbers.insert(3); // 重复元素插入会被忽略

    // 查找元素
    int key = 2;
    if (numbers.find(key) != numbers.end()) {
        std::cout << key << "在集合中" << std::endl;
    } else {
        std::cout << key << "不在集合中" << std::endl;
    }

    // 遍历unordered_set
    for (const auto& num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

在此代码示例中,我们创建了一个unordered_set来存储整数。注意,重复插入的3会被自动忽略。

3. unordered_multimap 和 unordered_multiset

unordered_multimapunordered_multiset与前两者类似,但它们允许存储重复的键值对和元素。它们的使用方式与unordered_mapunordered_set大同小异。

示例代码(unordered_multimap):

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_multimap<std::string, int> name_age_map;

    // 插入多个相同键的元素
    name_age_map.insert({"Alice", 25});
    name_age_map.insert({"Alice", 30});
    name_age_map.insert({"Bob", 40});

    // 查找元素
    auto range = name_age_map.equal_range("Alice");
    std::cout << "Alice的年龄有: ";
    for (auto it = range.first; it != range.second; ++it) {
        std::cout << it->second << " ";
    }
    std::cout << std::endl;

    return 0;
}

在这个例子中,我们插入了多个相同名称的年龄,并通过equal_range方法找到了所有与"Alice"相关的年龄。

总结

C++中的unordered系列提供了一种高效的方式来存储和管理数据。与传统的有序容器(如mapset)相比,unordered系列在插入和查找操作上具有更好的性能。开发者可以根据具体需求选择最适合的容器,以提高程序的效率和性能。使用unordered系列,可以让数据的查找、插入和删除都变得快速而简单,非常适合对性能要求较高的场合。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部