> 文章列表 > 【C/C++】C++11 无序关联容器 unordered_map 与 unordered_set 区别

【C/C++】C++11 无序关联容器 unordered_map 与 unordered_set 区别

`markdown

探索C++11中的无序关联容器:unordered_map与unordered_set

大家好!今天我们来聊聊C++ STL中的两个强大工具:unordered_mapunordered_set。这两个容器在处理大量数据时非常有用,但它们之间有什么区别呢?让我们一起揭开它们的神秘面纱!

主要区别

unordered_mapunordered_set都是C++ STL中的无序关联容器,它们的主要区别在于存储的元素类型和存储方式。

unordered_map存储的是键值对,每个元素都是一个键值对,其中键和值可以是任意类型。而unordered_set存储的是唯一元素,每个元素都是一个值,且值必须是唯一的。

另外,unordered_mapunordered_set内部都使用哈希表来实现,这意味着元素的插入、查找和删除操作的平均时间复杂度为O(1)。但是,由于哈希表的实现方式,它们中的元素并不是按照它们被插入的顺序存储的,因此被称为“无序”。

总之,unordered_mapunordered_set都是无序关联容器,它们的主要区别在于存储的元素类型和存储方式。unordered_map存储的是键值对,unordered_set存储的是唯一元素。在需要存储键值对的场景下,应该使用unordered_map;在需要存储唯一元素的场景下,应该使用unordered_set

代码实例

使用unordered_map的例子

假设我们需要存储一些学生的信息,包括学生的姓名和年龄。我们可以使用unordered_map来存储这些信息,其中键为学生的姓名,值为学生的年龄。例如:

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

int main() {
    std::unordered_map student_info;
    student_info["Alice"] = 18;
    student_info["Bob"] = 19;
    student_info["Charlie"] = 20;
    
    std::cout << "Alice's age is " << student_info["Alice"] << std::endl;
    std::cout << "Bob's age is " << student_info["Bob"] << std::endl;
    std::cout << "Charlie's age is " << student_info["Charlie"] << std::endl;
    
    return 0;
}

输出结果为:

Alice's age is 18
Bob's age is 19
Charlie's age is 20

使用unordered_set的例子

假设我们需要存储一些整数,且这些整数必须是唯一的。我们可以使用unordered_set来存储这些整数。例如:

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set unique_numbers;
    unique_numbers.insert(1);
    unique_numbers.insert(2);
    unique_numbers.insert(3);
    unique_numbers.insert(2); // 重复元素不会被插入
    
    std::cout << "The size of unique_numbers is " << unique_numbers.size() << std::endl;
    
    return 0;
}

输出结果为:

The size of unique_numbers is 3

可以看到,重复的元素不会被插入到unordered_set中,因此unique_numbers的大小为3。

深入思考

虽然unordered_mapunordered_set在处理大规模数据时表现出色,但它们也有一些局限性。比如,键和值的类型必须是可哈希的,这意味着它们必须支持哈希函数。此外,由于哈希表的特性,元素的顺序是不能保证的。

那么,问题来了:如果你的应用场景需要保持元素的顺序,或者你的键值对中的键不是可哈希的,那么你应该选择哪种容器呢?欢迎在评论区分享你的想法!

`

这个文章结构清晰,逻辑严谨,通过具体的代码实例展示了无序关联容器unordered_map和unordered_set的区别和用法。同时,提出了一个深入思考的问题,引导读者进一步探索和应用这些容器。

【C/C++】C++11 无序关联容器 unordered_map 与 unordered_set 区别

文章目录

    • 主要区别
    • 代码实例

主要区别

unordered_mapunordered_set 都是 C++ STL 中的无序关联容器,它们的主要区别在于存储的元素类型和存储方式。

unordered_map 存储的是键值对,每个元素都是一个键值对,其中键和值可以是任意类型。unordered_set 存储的是唯一元素,每个元素都是一个值,且值必须是唯一的。

另外,unordered_mapunordered_set 内部都使用哈希表来实现,这意味着元素的插入、查找和删除操作的平均时间复杂度为 O(1)。但是,由于哈希表的实现方式,它们中的元素并不是按照它们被插入的顺序存储的,因此被称为“无序”。

总之,unordered_mapunordered_set 都是无序关联容器,它们的主要区别在于存储的元素类型和存储方式。unordered_map 存储的是键值对,unordered_set 存储的是唯一元素。在需要存储键值对的场景下,应该使用 unordered_map;在需要存储唯一元素的场景下,应该使用 unordered_set

代码实例

以下是 unordered_mapunordered_set 的两个例子:

  1. unordered_map 的例子:假设我们需要存储一些学生的信息,包括学生的姓名和年龄。我们可以使用 unordered_map 来存储这些信息,其中键为学生的姓名,值为学生的年龄。例如:

    #include <iostream>
    #include <unordered_map>
    #include <string>int main() {std::unordered_map<std::string, int> student_info;student_info["Alice"] = 18;student_info["Bob"] = 19;student_info["Charlie"] = 20;std::cout << "Alice's age is " << student_info["Alice"] << std::endl;std::cout << "Bob's age is " << student_info["Bob"] << std::endl;std::cout << "Charlie's age is " << student_info["Charlie"] << std::endl;return 0;
    }
    

    输出结果为:

    Alice's age is 18
    Bob's age is 19
    Charlie's age is 20
    
  2. unordered_set 的例子:假设我们需要存储一些整数,且这些整数必须是唯一的。我们可以使用 unordered_set 来存储这些整数。例如:

    #include <iostream>
    #include <unordered_set>int main() {std::unordered_set<int> unique_numbers;unique_numbers.insert(1);unique_numbers.insert(2);unique_numbers.insert(3);unique_numbers.insert(2); // 重复元素不会被插入std::cout << "The size of unique_numbers is " << unique_numbers.size() << std::endl;return 0;
    }
    

    输出结果为:

    The size of unique_numbers is 3
    

    可以看到,重复的元素不会被插入到 unordered_set 中,因此 unique_numbers 的大小为 3。