如何迭代具有值的映射作为对?

时间:2017-06-13 15:58:32

标签: c++ dictionary stl multimap

我必须实施MST。我想添加值作为对。我的问题是如何遍历具有值的地图作为对以及如何访问地图。

    void addedge(multimap<int, pair<int, int> > dirgraph, int source, int dest, int weight)     // graph, source, dest, weight
    {
         dirgraph.insert(make_pair(weight, make_pair(source, dest)));
    }

    multimap<int, pair<int,int> > dirgraph;
    addedge(dirgraph, 0, 1, 5);
    addedge(dirgraph, 0, 4, 3);
    addedge(dirgraph, 1, 2, 1);
    addedge(dirgraph, 1, 4, 4);
    addedge(dirgraph, 4, 3, 3);
    addedge(dirgraph, 2, 3, 2);

    multimap<int, pair<int, int> >::iterator it = dirgraph.begin();
    multimap<int, pair<int, int> >::iterator itend = dirgraph.end();

    for (; it != itend; it++)
           cout << (*it).first << " from " << (*it).second.first << " to " << (*it).second.second << endl; // This dosen't work.

1 个答案:

答案 0 :(得分:3)

由于你的问题没有被标记,我假设是C ++ 11。这是您的代码的注释和改进版本。

using edge = std::pair<int,int>;                    // for clarity
using directional_graph = std::multimap<int,edge>;  // not std::map<edge,weight> ?

void add_edge(directional_graph &dirgraph,          // pass by reference
              int source, int dest, int weight)
{
  dirgraph.insert(std::make_pair(weight, std::make_pair(source, dest)));
}

directional_graph dirgraph;
add_edge(dirgraph, 0, 1, 5);
add_edge(dirgraph, 0, 4, 3);
add_edge(dirgraph, 1, 2, 1);
add_edge(dirgraph, 1, 4, 4);
add_edge(dirgraph, 4, 3, 3);
add_edge(dirgraph, 2, 3, 2);

for(const auto&x : dirgraph)
  std::cout << x.first << " from " << x.second.first << " to "
            << x.second.second << std::endl;

请注意,此代码更清晰,更清晰。我使用std::来避免错误using namespace std;。最重要的是,在add_edge()实际更改第一个参数的意义上,此代码是正确的。在您的代码中,您创建了图形的本地副本,该副本在实际图形上没有任何影响进行了修改。

只是旁注:我发现你使用图形的权重作为键是很奇怪的:你真的想用权重来识别边缘吗?我原以为edge类型更适合作为关键。在这种情况下,如果边缘是唯一的,那么您不需要multimap,而只需要普通的map