初识C++:基于红黑树的map与set封装
在C++中,std::map
和std::set
是两个常用的关联容器,它们分别实现了键-值和键集合的存储。这两个容器底层通常使用红黑树来实现,红黑树是一种自平衡的二叉搜索树,可以保证在最坏情况下,树高为O(log n),从而提供较快的查找、插入和删除操作。
下面是对std::map
和std::set
的基本封装和使用的介绍:
std::map
基础
std::map
是一个键值对容器,其中每个键都是唯一的。键按照特定顺序排列,默认使用 <
运算符,但可以自定义排序规则。
基本操作:
插入元素:
std::map<int, std::string> myMap;
myMap.insert({1, "Apple"});
myMap[2] = "Banana";
访问元素:
if (myMap.find(1) != myMap.end()) {
std::cout << "Key 1: " << myMap[1] << std::endl;
}
删除元素:
myMap.erase(1); // 删除键为1的元素
遍历元素:
for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
std::set
基础
std::set
是一个键集合容器,所有键都是唯一且按特定顺序排列。std::set
在插入相同元素时,不会保存重复的元素。
基本操作:
插入元素:
std::set<int> mySet;
mySet.insert(10);
mySet.insert(20);
检查元素:
if (mySet.find(10) != mySet.end()) {
std::cout << "10 is in the set." << std::endl;
}
删除元素:
mySet.erase(20); // 删除元素20
遍历元素:
for (const auto& elem : mySet) {
std::cout << elem << std::endl;
}
红黑树特性
红黑树是一种特殊的二叉搜索树,具有以下性质:
- 节点是红色或黑色。
- 根节点是黑色。
- 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
- 从任一节点到其每个叶子的所有路径都包含相同数量的黑色节点。
这些性质确保了树的高度不会超过 2 * log(n+1)
,从而保证了操作的时间复杂度为 O(log n)
。
通过以上C++标准库提供的std::map
和std::set
,开发人员可以很容易地利用红黑树的高效特性来进行数据存储和检索。定制自己的红黑树结构可以增加对高级数据结构的理解,但通常,标准库提供的容器已经足够高效和方便。