列出迭代器而不是dereferencable

时间:2016-11-25 15:20:11

标签: c++ list stl iterator unordered-map

所以我正在写这个道路网络类​​。它包含一个地图,用于保存一个顶点和一组与之相连的顶点。

struct vertex {
      double lat;  //latitude
      double longit;  //longitude
      vertex(double lat, double longit) :lat(lat), longit(longit) {}
};
struct hash_vertex { //hash function for map and set
      unsigned operator()(const vertex& v) const {
          string s(to_string(v.lat) + to_string(v.longit));
          hash<string> hash;
          return hash(s);
      }
};
struct equal_vertex {  //equal function for map and set
      bool operator()(const vertex &v1, const vertex &v2) const {
            return abs(v1.lat - v2.lat) + abs(v1.longit - v2.longit) < error;
      }
};
class road_network {
  private:
      unordered_map<vertex, unordered_set<vertex,hash_vertex,equal_vertex>, hash_vertex, equal_vertex> road;
  public:
      void addedge(const vertex &u, const vertex &v) {
          auto it = *road.find(u);
          auto it2 = *road.find(v);
          it.second.insert(v);
          it2.second.insert(u);
}
};

它已编译。但每当我尝试使用函数addge时,程序都会抛出一个运行时错误:列出迭代器而不是dereferencable?

有人能告诉我这段代码有什么问题吗?提前谢谢!

2 个答案:

答案 0 :(得分:0)

您应该在取消引用之前检查files的结果:

find

如果auto it = road.find(u); if (it != road.end()) { auto x = *it;} 找不到该元素,则返回find迭代器并取消引用未定义的行为。

答案 1 :(得分:0)

您取消引用find()的迭代器结果而不测试有效结果。像这样改变你的代码:

      auto it = road.find(u);
      auto it2 = road.find(v);
      if(it != road.end() && it2 != road.end()) {
          it->second.insert(v);
          it2->second.insert(u);
      }