【问题标题】:Type conversion on multidimensional map iterator多维映射迭代器上的类型转换
【发布时间】:2013-11-02 01:33:24
【问题描述】:

在获取地图键方面有点挣扎。我想要这个方法来修改一个边向量,其中索引是目标节点,该索引的值是权重。向量“edges”已经初始化足够大以容纳边缘。编译器抱怨它无法将迭代器类型转换为 int。如果可能的话,有人对如何处理这种转换有任何建议或想法吗?谢谢。这是我正在实施 Dijkstra 的 MOOC 最短路径的任务的一部分。

void CompleteGraph::GetNodeEdges(int Node, std::vector<int> &edges){
    // Modifies a vector of edges given the source node sorted by edge weight

    // Iterate over a map. Grab all edges that have the given start node(map's 1st key)
    typedef std::map<int, std::map<int, int> >::iterator iter;
    for(iter i = Graph.begin(); i != Graph.end(); i++){
        if (i->first == Node){
            edges[i->second.begin()] =  i->second.end();
        }
    }

    // Sort vector here: will do this next
}

【问题讨论】:

    标签: c++11 vector iterator stdmap


    【解决方案1】:

    你的问题显然出在这一行:

    edges[i->second.begin()] =  i->second.end();
    

    edges的key的类型是int,但是i-&gt;second.begin()返回的是一个迭代器,因为i-&gt;second返回的是一个map。我猜你需要类似的东西:

    edges[i->second.begin()->first] =  i->second.end();
    

    取决于您想使用来自Graph 的哪些信息,因为您尚未告诉我们Graph 代表什么。

    【讨论】:

    • 谢谢!这立即很有帮助。我理解 i->second 返回了一张地图,但错误地认为 .begin() 在真正交出地图的整个第一个条目时会交出第一个键。所以解决方案最终是:edges[i->second.begin()->first] = i->second.begin()->second;谢谢何塞!
    【解决方案2】:

    我怀疑你正在寻找这样的东西:

    iter i = Graph.find(Node);
    if (i != Graph.end()) {
      map<int, int>& edges_map = i->second;
      for (map<int, int>::iterator m = edges_map.begin();
           m != edges_map.end(); ++m) {
        if (edges.size() <= m->first) {
          edges.resize(m->first + 1);
        }
        edges[m->first] = m->second;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      相关资源
      最近更新 更多