我遇到一个特殊的问题,我的团队担心使用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会给出最大的时间,因为d期望。
是否有某些原因导致std :: chrono和std :: multimap不兼容?
答案 0 :(得分:1)
std::chrono::milliseconds lastTime = stateMap.rbegin()->first;
如果出现以下情况,则会导致未定义的行为
: stateMap
为空
有人修改了stateMap
中的数据,更改了其顺序。
程序中任何地方的任何人都已经执行或将在此代码行之前或之后执行未定义的行为。
否则,它将返回存储在stateMap
中的最大键值。