我很难弄清楚如何在以下类型的地图中插入元素。鉴于:
std::map<Node*, std::vector<pair<Edge*, Node*> > > adjacencyMap;
,其中Node
和Edge
是结构。我想创建一个图,两个节点之间的每个连接都应存储在此地图中。每个节点到另一个节点可能有多个连接。主要思想是,对于每个节点,可能会有一对边和节点对的列表,例如
node1 and node2 are connected through an edge12
node1 and node3 are connected through an edge13
adjacencyMap
应该
node1 -> [(edge12, node2), (edge13, node3)]
node2 -> [(edge12, node1)]
node3 -> [(edge13, node1)]
我知道如何插入像(node1, pair(edge12,node2))
这样的元素,但是如果(node1, pair(edge12,node2))
已经是元素,(node1, pair(edge13, node3))
这样的话,我不知道如何插入
node1 -> [(edge12, node2), (edge13, node3)].
我如何实现我的意图?
谢谢!
答案 0 :(得分:6)
我假设Node
和Edge
的内存管理在其他地方,因为存储原始指针意味着没有人会照顾他们的管理。
operator[]
中的 std::unordered_map
已经构建了一个默认值,如果它不那么尖锐的话,只需按下即可:
map[node1].emplace_back(edge13, node2);
map[node1].emplace_back(edge13, node3);
答案 1 :(得分:2)
您可以这样做:
adjacencyMap[node1] = {{edge12, node2}, {edge13, node3}};
adjacencyMap[node2] = {{edge12, node1}};
adjacencyMap[node3] = {{edge13, node1}};
甚至:
std::map<Node*, std::vector<std::pair<Edge*, Node*>>> adjacencyMap =
{
{node1, {{edge12, node2}, {edge13, node3}}},
{node2, {{edge12, node1}}},
{node3, {{edge13, node1}}}
};
要添加节点,您可以这样做:
// use alias to avoid several look-up
auto& v1 = adjacencyMap[node1]; // auto is std::vector<std::pair<Edge*, Node*>>>
// Then do job on the vector:
v1.emplace_back(edge12, node2);
v1.emplace_back(edge13, node3);