【发布时间】: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。 -
好的,所以大家一致认为它不应该这样做。上下文是不同网络上的一个大型程序,因此我将尝试在我可以带到这里的一个小测试主程序中重现该行为。我会回来的。