Call to implicitly-deleted default constructor of 'unordered_map<Point3D, MapPoint>'
时间: 2024-01-02 14:02:20 浏览: 222
这个错误信息意味着你正在尝试使用一个没有定义的默认构造函数创建一个 `unordered_map` 对象。可能的原因是你的 `Point3D` 或 `MapPoint` 类没有默认构造函数,而 `unordered_map` 需要一个默认构造函数来创建它的桶。
你可以通过以下几种方式来解决这个问题:
1. 为 `Point3D` 和 `MapPoint` 类添加默认构造函数。
2. 使用带有比较函数的自定义哈希函数,以便在 `unordered_map` 中使用自定义类型的键。
3. 使用 `emplace` 或 `insert` 函数来插入具有已定义构造函数的键值对。
相关问题
error: call to implicitly-deleted default constructor of 'unordered_map<vector<int>, int>'解释一下这个错误
这个错误是因为使用了一个未定义的默认构造函数,导致编译器无法生成默认构造函数。在C++11标准中,当一个类定义了拷贝构造函数或析构函数时,编译器会自动删除其默认构造函数,因为这些函数需要一个明确的对象来进行初始化或销毁。
在这个错误中,可能是因为使用了`unordered_map`模板类,但没有为`vector<int>`类型定义默认的哈希函数和相等函数。为了解决这个问题,你需要手动定义一个哈希函数和相等函数,并将它们作为模板参数传递给`unordered_map`。
例如:
```c++
#include <unordered_map>
#include <vector>
struct VectorHasher {
size_t operator()(const std::vector<int>& v) const {
size_t seed = v.size();
for (auto& i : v) {
seed ^= i + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
return seed;
}
};
struct VectorEqual {
bool operator()(const std::vector<int>& lhs, const std::vector<int>& rhs) const {
return lhs == rhs;
}
};
std::unordered_map<std::vector<int>, int, VectorHasher, VectorEqual> my_map;
```
在上面的代码中,我们定义了一个`VectorHasher`类和一个`VectorEqual`类,分别实现了哈希函数和相等函数。然后我们通过将它们作为模板参数传递给`unordered_map`来创建了一个`my_map`对象。
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 的哈希算法来计算哈希值。这是一种比较高效的哈希算法,可以参考相关文献了解更多细节。
阅读全文