【C/C++】C++11 无序关联容器 unordered_map 与 unordered_set 区别
`markdown
探索C++11中的无序关联容器:unordered_map与unordered_set
大家好!今天我们来聊聊C++ STL中的两个强大工具:unordered_map
和unordered_set
。这两个容器在处理大量数据时非常有用,但它们之间有什么区别呢?让我们一起揭开它们的神秘面纱!
主要区别
unordered_map
和unordered_set
都是C++ STL中的无序关联容器,它们的主要区别在于存储的元素类型和存储方式。
unordered_map
存储的是键值对,每个元素都是一个键值对,其中键和值可以是任意类型。而unordered_set
存储的是唯一元素,每个元素都是一个值,且值必须是唯一的。
另外,unordered_map
和unordered_set
内部都使用哈希表来实现,这意味着元素的插入、查找和删除操作的平均时间复杂度为O(1)。但是,由于哈希表的实现方式,它们中的元素并不是按照它们被插入的顺序存储的,因此被称为“无序”。
总之,unordered_map
和unordered_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_map
和unordered_set
在处理大规模数据时表现出色,但它们也有一些局限性。比如,键和值的类型必须是可哈希的,这意味着它们必须支持哈希函数。此外,由于哈希表的特性,元素的顺序是不能保证的。
那么,问题来了:如果你的应用场景需要保持元素的顺序,或者你的键值对中的键不是可哈希的,那么你应该选择哪种容器呢?欢迎在评论区分享你的想法!
`
这个文章结构清晰,逻辑严谨,通过具体的代码实例展示了无序关联容器unordered_map和unordered_set的区别和用法。同时,提出了一个深入思考的问题,引导读者进一步探索和应用这些容器。
文章目录
-
- 主要区别
- 代码实例
主要区别
unordered_map
和 unordered_set
都是 C++ STL 中的无序关联容器,它们的主要区别在于存储的元素类型和存储方式。
unordered_map
存储的是键值对,每个元素都是一个键值对,其中键和值可以是任意类型。unordered_set
存储的是唯一元素,每个元素都是一个值,且值必须是唯一的。
另外,unordered_map
和 unordered_set
内部都使用哈希表来实现,这意味着元素的插入、查找和删除操作的平均时间复杂度为 O(1)。但是,由于哈希表的实现方式,它们中的元素并不是按照它们被插入的顺序存储的,因此被称为“无序”。
总之,unordered_map
和 unordered_set
都是无序关联容器,它们的主要区别在于存储的元素类型和存储方式。unordered_map
存储的是键值对,unordered_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<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
-
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。