unordered_set<vector<int>>set为什么这段代码会错误
时间: 2023-12-07 15:03:28 浏览: 205
这段代码会出错是因为`vector<int>`不是一个可哈希的类型,而`unordered_set`底层是通过哈希表实现的,需要元素类型能够被哈希。如果一定要使用`vector<int>`作为`unordered_set`的元素类型,需要自定义哈希函数并提供给`unordered_set`使用。以下是一个示例的自定义哈希函数:
```c++
struct VectorHash {
size_t operator()(const std::vector<int>& v) const {
std::hash<int> hasher;
size_t seed = 0;
for (int i : v) {
seed ^= hasher(i) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
return seed;
}
};
```
然后可以这样定义`unordered_set`:
```c++
unordered_set<vector<int>, VectorHash> my_set;
```
这样就可以通过编译了。
相关问题
Char 36: error: call to implicitly-deleted default constructor of 'unordered_set<vector<int>>' unordered_set<vector<int>> set;
这个错误信息是因为 `unordered_set` 中的元素类型 `vector<int>` 并没有默认构造函数。因此,当你创建 `unordered_set<vector<int>>` 类型的对象时,会调用默认构造函数,但由于元素类型没有默认构造函数,所以会报错。
解决方法是使用自定义哈希函数,显式地指定哈希表的大小,或者使用其他支持类型的容器代替 `unordered_set<vector<int>>`。
以下是使用自定义哈希函数的示例代码:
```c++
#include <iostream>
#include <unordered_set>
#include <vector>
struct VectorHash {
std::size_t operator()(const std::vector<int>& v) const {
std::size_t seed = v.size();
for(auto& i : v) {
seed ^= i + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
return seed;
}
};
int main() {
std::unordered_set<std::vector<int>, VectorHash> set;
set.insert({1, 2, 3});
set.insert({4, 5, 6});
std::cout << set.size() << std::endl; // output: 2
return 0;
}
```
在这个示例中,我们定义了一个名为 `VectorHash` 的结构体,其中包含一个函数调用运算符 `operator()`,用于计算 `vector<int>` 类型的哈希值。在创建 `unordered_set<std::vector<int>, VectorHash>` 类型的对象时,我们将 `VectorHash` 结构体作为第二个模板参数传递给 `unordered_set`,从而使用自定义哈希函数。
需要注意的是,在哈希函数中,我们使用了一种叫做 MurmurHash 的哈希算法来计算哈希值。这是一种比较高效的哈希算法,可以参考相关文献了解更多细节。
unordered_set<int>和vector<int>转换
可以使用vector<int>的构造函数将unordered_set<int>转换为vector<int>,代码如下:
```c++
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int main() {
unordered_set<int> mySet = {1, 2, 3, 4, 5};
vector<int> myVector(mySet.begin(), mySet.end());
for (int i = 0; i < myVector.size(); i++) {
cout << myVector[i] << " ";
}
return 0;
}
```
输出结果为:1 2 3 4 5
可以使用vector<int>的assign函数将vector<int>转换为unordered_set<int>,代码如下:
```c++
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int main() {
vector<int> myVector = {1, 2, 3, 4, 5};
unordered_set<int> mySet;
mySet.assign(myVector.begin(), myVector.end());
for (int x : mySet) {
cout << x << " ";
}
return 0;
}
```
输出结果为:1 2 3 4 5
阅读全文