C++标准模板库(STL)unordered_set
一、定义与头文件
1. 定义
在C++中,unordered_set是一个无序的关联容器。它存储唯一的元素,并且不允许有重复的值。与set不同的是,unordered_set中的元素没有特定的顺序(不像set是按照元素的值自动排序的),它基于哈希表实现,这使得查找、插入和删除操作平均时间复杂度为常数时间(在理想情况下)。
2. 头文件
需要包含<unordered_set>头文件才能使用unordered_set容器。
二、基本操作
1. 创建unordered_set对象
可以创建一个空的unordered_set,例如:
std::unordered_set<int> mySet; // 这里创建了一个存储int类型元素的unordered_set
也可以在创建时初始化:
std::unordered_set<int> mySet = {1, 3, 5};
2. 插入元素
使用insert方法。例如:
mySet.insert(7);
如果插入的元素已经存在于unordered_set中,插入操作将被忽略,因为unordered_set不允许重复元素。
3. 查找元素
使用find方法。例如:
std::unordered_set<int>::iterator it = mySet.find(5);
如果it!= mySet.end(),则表示找到了元素,否则表示元素不存在。
4. 遍历unordered_set
可以使用迭代器遍历unordered_set。例如:
for (auto it = mySet.begin(); it!= mySet.end(); ++it) { std::cout << *it << " "; }
或者使用基于范围的for循环(C++11及以上):
for (const auto& element : mySet) { std::cout << element << " "; }
5. 删除元素
使用erase方法。例如:
如果要删除值为5的元素:
mySet.erase(5);
也可以通过迭代器删除:
auto it = mySet.find(5); if (it!= mySet.end()) { mySet.erase(it); }
三、自定义哈希函数和相等比较器(针对自定义类型)
1. 自定义哈希函数
当unordered_set存储自定义类型时,需要提供自定义的哈希函数。例如,对于一个自定义的结构体MyType:
struct MyType { int value; }; struct MyHash { std::size_t operator()(const MyType& obj) const { return std::hash<int>()(obj.value); } };
然后创建unordered_set时使用自定义哈希函数:
std::unordered_set<MyType, MyHash> myCustomSet;
2. 自定义相等比较器
如果默认的相等比较(基于operator==)不满足需求,可以定义自定义的相等比较器。例如:
struct MyEqual { bool operator()(const MyType& a, const MyType& b) const { return a.value == b.value; } };
然后创建unordered_set时同时使用自定义哈希函数和相等比较器:
std::unordered_set<MyType, MyHash, MyEqual> myFullCustomSet;