【问题标题】:std::multimap<std::chrono::milliseconds, T>::rbegin points to end() in MSVS-13?std::multimap<std::chrono::milliseconds, T>::rbegin 指向 MSVS-13 中的 end()?
【发布时间】:2018-10-15 19:03:50
【问题描述】:

我遇到了一个让我的团队担心使用 std::chrono 的特殊问题。

我们正在使用 MSVS-13,所以是 C++11。

我有一组对象状态存储在多映射中,由 std:chrono::milliseconds 键控。我想在地图中找到最后一次(最大持续时间键值)。显而易见的答案是使用 rbegin():

class ObjectState{};
typedef std::multimap<std::chrono::milliseconds, ObjectState> MapType
main()
{
    MapType stateMap;

    // add some states

    // read the last time
    std::chrono::milliseconds lastTime = stateMap.rbegin()->first;
}

但在我的构建中,这是核心。查看调试器,似乎 rbegin() 指向地图后的无效位置,就像 end() 应该的那样。

我确认递增 rbegin() 返回的迭代器确实会到达地图中的最后一项。

我读到的所有内容都说它不应该那样做,如果我通过“double”而不是“std::chrono::milliseconds”来键入地图,那么 rbegin()->first 给出了我最大的时间期待。

std::chrono 和 std::multimap 不兼容有什么原因吗?

【问题讨论】:

  • 您的代码中可能存在错误。由于您没有显示代码,我不能说在哪里。虽然 MSVC 在这里出错的可能性很小,但我非常倾向于认为这是您的代码。
  • 请制作一个实际填充地图的最小示例。确保在发布之前对其进行测试(以验证它具有与您声称的相同的行为)。这将允许我们测试错误。 minimal reproducible example 我有 Visual Studio 2013,所以我可以测试是否有重现问题的代码。
  • 我也想知道是谁支持了这个质量很低的问题。
  • 在 c++ 中,main 需要返回类型为int。看起来你给了它返回类型MapType
  • 好的,所以大家一致认为它不应该这样做。上下文是不同网络上的一个大型程序,因此我将尝试在我可以带到这里的一个小测试主程序中重现该行为。我会回来的。

标签: c++ c++11 multimap chrono


【解决方案1】:
std::chrono::milliseconds lastTime = stateMap.rbegin()->first;

这会导致未定义的行为,如果:

  1. stateMap 为空

  2. 有人修改了stateMap 中的数据,从而改变了其顺序。

  3. 程序中任何地方的任何人都已经或将在这行代码之前或之后执行未定义的行为。

否则返回stateMap中存储的最大键值。

【讨论】:

  • ... 或用户 "overrode" 默认比较(使用非模板函数在重载决议中优先这一事实)并提供不符合相关要求(严格弱排序,等等)。只是挑剔:-) 编辑:第二个想法可能属于案例#3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2021-08-23
  • 1970-01-01
  • 2014-03-23
相关资源
最近更新 更多