struct Graph { unordered_map<int, Point> points; unordered_map<int, unordered_map<int, int>> edges; void addPoint(int id, string name, string intro) { points[id] = Point(id, name, intro); } void addEdge(int from, int to, int weight) { edges[from][to] = weight; edges[to][from] = weight; } };
时间: 2024-04-27 10:25:31 浏览: 11
这段代码是一个图的数据结构的实现,包含点和边的信息。其中,点用一个 `unordered_map` 存储,键为点的id,值为一个 `Point` 类型,存储了点的名称和介绍。边用一个二维的 `unordered_map` 存储,键为起点id,值为一个 `unordered_map`,二级键为终点id,值为边的权重。
该数据结构提供了两个方法:`addPoint` 和 `addEdge`,用于向图中添加点和边。其中,`addPoint` 接收三个参数,点的id、名称和介绍,将其封装成 `Point` 类型并添加到 `points` 中。而 `addEdge` 接收三个参数,边的起点、终点和权重,将其添加到 `edges` 中。需要注意的是,由于是无向图,因此在添加边的时候,需要将起点和终点都添加到 `edges` 中,并设置相同的权重。
相关问题
unordered_set<vector<int>>set为什么这段代码会错误
这段代码会出错是因为`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;
```
这样就可以通过编译了。
unordered_map<string, struct>如果是结构体如何遍历
可以使用 C++11 新增的范围遍历语法,对 `unordered_map` 中的键值对进行遍历,代码示例如下:
```c++
#include <iostream>
#include <unordered_map>
#include <string>
struct Person {
int age;
std::string address;
};
int main() {
std::unordered_map<std::string, Person> personMap = {
{"Tom", {20, "Beijing"}},
{"Jerry", {25, "Shanghai"}},
{"Kate", {18, "Guangzhou"}}
};
// 使用范围遍历语法访问 unordered_map 中的键值对
for (const auto& [name, person] : personMap) {
std::cout << "Name: " << name << ", Age: " << person.age
<< ", Address: " << person.address << std::endl;
}
return 0;
}
```
输出结果为:
```
Name: Tom, Age: 20, Address: Beijing
Name: Jerry, Age: 25, Address: Shanghai
Name: Kate, Age: 18, Address: Guangzhou
```