簡體   English   中英

列出迭代器而不是dereferencable

[英]List iterator not dereferencable

所以我正在寫這個道路網絡類​​。它包含一個地圖,用於保持一個頂點和一組與之相連的頂點。

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?

有人能告訴我這段代碼有什么問題嗎? 提前致謝!

你應該在解除引用之前檢查find的結果:

auto it = road.find(u);
if (it != road.end()) {  auto x = *it;}

如果find找不到該元素,則返回end迭代器和解除引用的未定義行為。

您取消引用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);
      }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM