C++ STL 中 map 和 set 的实现与应用
C++ STL(标准模板库)中的 map
和 set
都是基于红黑树(Red-Black Tree)实现的。这种树是一种自平衡的二叉搜索树,以保证在最坏情况下能够提供对数时间复杂度的查找、插入和删除操作。以下是它们的实现细节和应用:
map
实现与应用
实现:
- 数据结构:
map
是一种关联容器,存储键值对(key-value pair)。每个键是唯一的,值可以重复。 - 内部实现:为保证高效的查找和排序,
map
底层使用红黑树实现。红黑树是一种确保树高近似对数增长的二叉搜索树,通过旋转和重新着色在插入和删除操作后维持其平衡。 - 时间复杂度:查找、插入和删除操作都为 O(log n)。
应用:
- 字典(Dictionary):存储键值对,例如存储单词及其定义。
- 计数器:统计数据出现的次数,例如:统计一篇文章中各个单词出现的频率。
- 缓存:实现简单的缓存系统,通过键快速查找到已缓存的数据。
set
实现与应用
实现:
- 数据结构:
set
是一种关联容器,存储的是唯一的元素,没有重复。 - 内部实现:
set
也使用红黑树来存储数据,确保元素有序且操作效率高。 - 时间复杂度:查找、插入和删除操作都是 O(log n)。
应用:
- 元素去重:维护一组唯一的元素,例如:从数据流中排除重复的值。
- 集合操作:实现数学集合中的交集、并集和差集等操作。
- 查找:快速查找一个元素是否在集合中。
使用示例
#include <iostream>
#include <map>
#include <set>
// map 使用示例
void mapExample() {
std::map<std::string, int> wordCount;
wordCount["apple"] = 3;
wordCount["banana"] = 2;
wordCount["orange"] = 5;
for (const auto& pair : wordCount) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
}
// set 使用示例
void setExample() {
std::set<int> uniqueNumbers;
uniqueNumbers.insert(10);
uniqueNumbers.insert(20);
uniqueNumbers.insert(10); // 插入一个重复值
for (const auto& number : uniqueNumbers) {
std::cout << number << " ";
}
std::cout << std::endl;
}
int main() {
mapExample();
setExample();
return 0;
}
这个示例代码展示了如何使用 map
和 set
存储数据并进行简单的操作。map
在这里用于计数,set
则用于存储唯一的数字列表。