介绍一下Cpp中的unordered_set
时间: 2023-05-27 21:07:05 浏览: 98
unordered_set是C++ STL提供的一种无序关联容器,用于存储唯一的元素集合。它基于哈希表实现,使用哈希函数来计算元素的索引值,从而快速地查找元素。与set相比,unordered_set没有排序,但是它的插入、删除和查找操作的平均时间复杂度为常数级别O(1),因此在处理大量数据时效率更高。
unordered_set的声明方式为:
```c++
std::unordered_set<元素类型> set_name;
```
其中,元素类型可以是任何可以哈希的类型,如基本数据类型、自定义结构体等。unordered_set的成员函数和操作方式与set基本相同,包括:
- 插入元素:insert(value);
- 删除元素:erase(value)、clear();
- 查找元素:count(value)、find(value);
- 获取大小:size();
- 遍历元素:使用迭代器等方法。
需要注意的是,unordered_set中的元素是无序的,因此无法使用下标访问元素。此外,unordered_set还可以通过自定义哈希函数来提高性能,具体方法可以参考STL文档。
相关问题
cpp中unordered_set如何查询元素?
使用 `unordered_set` 查询元素可以使用 `find()` 函数,该函数返回一个迭代器,如果元素存在于 `unordered_set` 中,则迭代器指向该元素,否则迭代器指向 `unordered_set` 的末尾。以下是一个使用 `unordered_set` 查询元素的示例代码:
```cpp
#include <iostream>
#include <unordered_set>
int main()
{
std::unordered_set<int> my_set = {1, 2, 3, 4, 5};
int key = 3;
auto it = my_set.find(key);
if (it != my_set.end()) {
std::cout << "Element " << key << " found in my_set\n";
} else {
std::cout << "Element " << key << " not found in my_set\n";
}
return 0;
}
```
在上面的示例中,我们创建了一个 `unordered_set`,然后使用 `find()` 函数查询元素 `3` 是否存在于 `unordered_set` 中。如果元素存在,则输出 `"Element 3 found in my_set"`,否则输出 `"Element 3 not found in my_set"`。
cpp中unordered_set<double>存在浮点数2.5,为什么查找2.5是否存在会失败?
在`unordered_set`中使用浮点数作为键可能会导致查找失败的问题,这是因为浮点数在计算机中是以近似值存储的,而不是精确值。例如,你可能会认为浮点数2.5应该是精确的,但是在计算机中,它可能会被存储为2.4999999999999999999或2.50000000000000000001等近似值。当你在`unordered_set`中查找2.5时,实际上是在查找这个近似值,而不是精确的2.5,因此可能会失败。
为了解决这个问题,你可以使用一个精度范围来进行查找。例如,你可以定义一个小于号运算符,并使用`std::abs`函数来比较两个浮点数的差是否小于一个给定的精度范围,然后将这个小于号运算符传递给`unordered_set`的模板参数中,以保证查找的精度。示例如下:
```
#include <unordered_set>
#include <iostream>
#include <cmath>
struct DoubleHash {
double eps = 1e-9; // 设置一个精度范围
bool operator()(double x, double y) const {
return std::abs(x - y) < eps;
}
};
int main() {
std::unordered_set<double, DoubleHash> mySet{2.5};
if (mySet.find(2.5) != mySet.end()) {
std::cout << "2.5 exists in mySet." << std::endl;
} else {
std::cout << "2.5 does not exist in mySet." << std::endl;
}
return 0;
}
```
输出结果为:
```
2.5 exists in mySet.
```
需要注意的是,使用一个精度范围来进行查找可能会影响查找的效率。因此,你需要根据实际情况来选择适当的精度范围。
阅读全文