C++学习第二十一课:STL集合类的深入探索
STL集合类在C++中扮演着重要的角色,它们提供了一组固定大小的容器,其中的元素按照特定的顺序进行组织。本课将详细介绍STL中的集合类,包括std::set
、std::map
、std::multiset
和std::multimap
,并探讨它们的用法和示例代码。
1. 集合类概述
STL中的集合类提供了一组不允许重复元素的容器,它们基于平衡二叉树实现。
示例代码
#include <set>
std::set<int> mySet = {1, 2, 3, 2}; // 集合中的2只会出现一次
2. 初始化集合
可以初始化集合类容器,包括从数组、迭代器范围或另一个容器拷贝。
示例代码
int arr[] = {1, 2, 3, 4, 5};
std::set<int> mySet(arr, arr + 5); // 从数组初始化
3. 访问和修改元素
集合类容器不允许直接访问元素,但可以使用迭代器进行遍历。
示例代码
for (int num : mySet) {
std::cout << num << " ";
}
4. 添加和移除元素
可以使用insert
和erase
函数来添加和移除元素。
示例代码
mySet.insert(4); // 添加一个元素
auto it = mySet.find(2);
if (it != mySet.end()) {
mySet.erase(it); // 移除一个元素
}
5. 集合的操作
集合类提供了如count
、lower_bound
、upper_bound
等操作。
示例代码
if (mySet.count(3)) {
std::cout << "3 is in the set" << std::endl;
}
6. 集合比较
集合类支持比较运算符,可以比较两个集合是否相等。
示例代码
std::set<int> anotherSet = {1, 2, 3};
if (mySet == anotherSet) {
std::cout << "Sets are equal" << std::endl;
}
7. 集合的集合操作
STL提供了集合的并集、交集、差集等操作。
示例代码
std::set<int> unionSet(mySet);
std::set_union(mySet.begin(), mySet.end(), anotherSet.begin(), anotherSet.end(), std::inserter(unionSet, unionSet.end()));
8. std::map
类
std::map
是一个关联容器,它存储键值对,并且每一键只能出现一次。
示例代码
#include <map>
std::map<int, std::string> myMap;
myMap[1] = "one";
myMap[2] = "two";
9. std::multiset
和std::multimap
与std::set
和std::map
类似,但允许键的重复。
示例代码
#include <multiset>
std::multiset<int> myMultiSet = {{1, 2}, {2, 3}, {2, 5}};
10. 迭代器和反向迭代器
集合类容器支持迭代器和反向迭代器。
示例代码
for (auto it = mySet.rbegin(); it != mySet.rend(); ++it) {
std::cout << *it << " ";
}
结语
通过本课的学习,你深入了解了STL中的集合类容器,包括std::set
、std::map
、std::multiset
和std::multimap
,以及它们的初始化、元素访问、添加和移除元素、集合操作、迭代器使用、内存管理、异常安全性、实际应用、线程安全性和性能考量。
集合类容器是C++中处理集合和关联容器的强大工具,它们在需要避免元素重复的场景下非常有用。掌握集合类容器的使用对于编写高效、安全、可维护的C++程序至关重要。