在 C++ 中,集合通常指的是标准模板库(STL)中的 std::set
或 std::unordered_set
。这两个都是用来存储不重复元素的容器,但在实现和使用方式上有一些区别。
1. std::set
:
- 基于红黑树实现,元素按照严格的顺序(默认是升序)排列。
- 插入、查找、删除操作的平均时间复杂度为 O(log n)。
- 不支持直接修改元素的值,但可以通过删除再插入的方式来实现。
- 用法示例:
#include <iostream>
#include <set>int main() {std::set<int> mySet;// 插入元素mySet.insert(3);mySet.insert(1);mySet.insert(4);mySet.insert(2);// 查找元素if (mySet.find(3) != mySet.end()) {std::cout << "3 存在于集合中" << std::endl;}// 删除元素mySet.erase(4);// 遍历集合for (int x : mySet) {std::cout << x << " ";}std::cout << std::endl;return 0;
}
2. std::unordered_set
:
- 基于哈希表实现,元素无序存储。
- 插入、查找、删除操作的平均时间复杂度为 O(1)。
- 元素类型必须支持哈希函数,或者提供自定义的哈希函数。
- 用法示例:
#include <iostream> #include <unordered_set>int main() {std::unordered_set<int> mySet;// 插入元素mySet.insert(3);mySet.insert(1);mySet.insert(4);mySet.insert(2);// 查找元素if (mySet.find(3) != mySet.end()) {std::cout << "3 存在于集合中" << std::endl;}// 删除元素mySet.erase(4);// 遍历集合for (int x : mySet) {std::cout << x << " ";}std::cout << std::endl;return 0; }
无论使用
std::set
还是std::unordered_set
,都需要包含<set>
或<unordered_set>
头文件,并且在编译时链接 STL 库。这些集合提供了强大的功能,可以方便地实现很多常见的数据结构和算法。
3.要判断一个元素是否在集合中
,你可以使用集合的 find()
函数。这个函数会返回一个迭代器,如果找到了元素,则返回指向该元素的迭代器;如果未找到,则返回集合的 end()
迭代器。下面是一个示例:
#include <iostream>
#include <set>int main() {std::set<int> mySet = {1, 2, 3, 4, 5};int element = 3;// 使用find()函数判断元素是否在集合中auto it = mySet.find(element);if (it != mySet.end()) {std::cout << element << " 存在于集合中" << std::endl;} else {std::cout << element << " 不在集合中" << std::endl;}return 0;
}
ps:
对于 std::set
中的 end()
,它返回的是指向集合中最后一个元素之后的位置。通常在使用 find()
函数查找元素时,如果找不到目标元素,find()
函数会返回 end()
指向的位置,表示找不到目标元素。因此,我们通常会将 find()
函数的返回值与 end()
迭代器进行比较,以判断是否找到了目标元素。