【问题标题】:map.end() error "iterator not dereferenceable" c++ [duplicate]map.end()错误“迭代器不可取消引用”c ++ [重复]
【发布时间】:2018-02-01 15:14:42
【问题描述】:
//Works    
cout << "map[0] value is " << doubleStatsMap.begin()->first<< endl;
//gives error
cout << "map[last value is " << doubleStatsMap.end()->first << endl;

我只是想获取地图最后一个元素的值。它可以正常工作 “map.begin->first” 但是给“map/set iterator not dereferencable” “map.end()->first”。 它不能为空,因为地图有一个开始,因此它有一个结束。我读过的所有内容都说这应该有效。任何建议都非常感谢!

【问题讨论】:

  • 迭代器形成半开范围...请再次阅读迭代器文档。
  • 您正在考虑back(),它返回对最后一个元素的引用。
  • “我所阅读的所有内容都表明这应该有效。” 您应该获得更好的阅读材料或更仔细地阅读材料。
  • end() 是最后一个元素的迭代器 - 你不能取消引用它;它没有指向一个有效的元素。

标签: c++ dictionary


【解决方案1】:

试图从 end 迭代器中获取任何东西会导致未定义的行为。

要获取最后一项,可以使用std::map::rbegin()。

// cout << "map[last value is " << doubleStatsMap.end()->first << endl;
cout << "map[last value is " << doubleStatsMap.rbegin()->first << endl;

【讨论】:

  • 谢谢。我不在乎我是否因为提出这个问题而被否决。我看到了 end 的例子,它让我发疯。
  • 那么将“第一”和“第二”函数附加到 end() 有什么意义。此外,即使有一个 [名称不佳] 结束函数,因为无论如何都不能像数组一样按索引引用地图,这又有什么意义呢?
  • @Mason,好问题。他们的答案很长,不适合 SO 评论。
  • @Mason end 不是“名字不好” - 阅读半开范围。另外,请阅读:stackoverflow.com/questions/13066884/…(尤其是接受的答案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多