在C++中,unordered系列
是STL(标准模板库)中一个非常重要的部分,主要用于存储和管理数据。它们提供了一种HASH表的实现,支持快速的插入、删除和查找操作,这些操作的时间复杂度平均为O(1)。C++标准库中的unordered系列主要包括unordered_map
、unordered_set
、unordered_multimap
和unordered_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_multimap
和unordered_multiset
与前两者类似,但它们允许存储重复的键值对和元素。它们的使用方式与unordered_map
和unordered_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系列提供了一种高效的方式来存储和管理数据。与传统的有序容器(如map
和set
)相比,unordered系列在插入和查找操作上具有更好的性能。开发者可以根据具体需求选择最适合的容器,以提高程序的效率和性能。使用unordered系列,可以让数据的查找、插入和删除都变得快速而简单,非常适合对性能要求较高的场合。