封装 unordered_set 指的是在 unordered_set 容器的基础上进行封装,增加容器的功能或者修改其行为,以便更好地适应特定的需求。
封装 unordered_set 的方式与封装 unordered_map 的方式类似,我们可以使用类或者结构体封装 unordered_set 容器,并添加一些自定义函数或者成员变量。下面是一个简单的例子:
#include <unordered_set>
#include <iostream>
template<typename T>
class MySet {
public:
MySet() {}
~MySet() {}
// 添加元素
void insert(const T& value) {
set_.insert(value);
}
// 删除元素
void erase(const T& value) {
set_.erase(value);
}
// 遍历元素并执行操作
void forEach(void (*func)(T)) {
for (const auto& elem : set_) {
func(elem);
}
}
// 判断元素是否存在
bool contains(const T& value) {
return set_.count(value) > 0;
}
// 返回元素个数
size_t size() {
return set_.size();
}
private:
std::unordered_set<T> set_;
};
在上面的例子中,我们定义了一个 MySet 类模板,封装了 unordered_set 容器,并添加了 insert、erase、forEach、contains 和 size 等成员函数。其中,forEach 函数用于遍历 unordered_set 容器中的元素,并执行指定的操作;contains 函数用于判断容器中是否包含指定的元素;size 函数用于返回容器中元素的个数。
下面是使用 MySet 类的例子:
void printInt(int value) {
std::cout << value << " ";
}
int main() {
MySet<int> mySet;
mySet.insert(1);
mySet.insert(2);
mySet.insert(3);
mySet.insert(2);
std::cout << "set size: " << mySet.size() << std::endl;
mySet.forEach(&printInt);
std::cout << std::endl;
mySet.erase(2);
mySet.forEach(&printInt);
std::cout << std::endl;
std::cout << "contains 3: " << mySet.contains(3) << std::endl;
std::cout << "contains 2: " << mySet.contains(2) << std::endl;
return 0;
}
在上面的例子中,我们使用 MySet 类创建一个整型的集合,并插入了一些元素,通过 forEach 函数遍历集合中的元素并输出;通过 erase 函数删除了一个元素;通过 contains 函数判断集合中是否包含指定的元素。