在 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() 迭代器进行比较,以判断是否找到了目标元素。