技术解析

请教 stl 中 unordered_set 使用问题
0
2021-06-02 16:31:59
idczone

完整可编译代码:

#include 
#in抗投诉服务器clude 
#include 
#include 

using namespace std;

int main()
{
    vector ans;
    set> res;
    //unordered_set> foo;
    return 0;
}

如果放开注释会报错,看了 unordered_set,实在没发现哪里有问题?

发现原因: 刷 leetcode 时使用 set 去重结果,想到之前看到一篇文章(如果有错欢迎纠正):map unordered_map,map 插入元素自动排序,底层实现是红黑树,而 unordered_map 底层实现则时哈希表,可以用来去重,这里我类比到 set,想优化一下,发现编译报错。

####end 感谢各位指点


换了个 docker 编译,加上-std=c++17 编译通过了…………

unordered_set 应该要求元素有 hash,在 https://en.cppreference.com/w/cpp/utility/hash 没有看到 std::hash>的 specialization 。
表示很好奇为何加上-std=c++17 编译通过

同好奇,我这里开 C++17 也并不能编译通过

好奇的人又多了两个,昨天刷题想把 set 改成 unordered_set 加快速度,发现过不了,本地 docker 环境下升级了 gcc 添加 c++17 就可以通过的,力扣和 leetcode.com 上都编不过……

不是 `unordered_set foo;` 吗

unordered_set 内的元素不能被修改,你加了--std=c++17 可能是你容器里的环境有方言……

你容器里的编译器是什么版本

```cpp
struct MyHash
{
std::size_t operator()(vector& v) const
{
return 1;
}
};
unordered_set, MyHash> foo;
```
`vector`是一个自定义的类型,默认没有 hash 函数,没有 equal 函数,需要自己定义。没定义它就会提示你`use
of delete function ... unordered_set() = default`,意思是这个无参的默认构建已经被标记为 delete 状态,不允许使用

惊了,你把 set 当啥用了,为什么会塞 vector 进去,难道查找的时候还要用 vector 去查吗?
set 就是没有 value 只有 key 的 map,或者说 value & key 一体,是用来快速确认某个数据是否存在的。
你如果是要一个可以遍历的容器,直接用 vector 、list 之类的。

力扣官方题给的答案这么写的……,我很无辜呀老铁。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服