概述
- std::sort 是不稳定的排序。在使用的时候,需要严格遵守排序准则,否则会导致异常产生。
问题描述
-
外网玩家发来bug:某天晚上,一个排行榜发生第一名A和第二名B,在数据为发生变化的情况下,会不停的交替更换。
-
经查,该排行榜的排序规则functor 是
bool compare_function(const std::shared_ptr<Data> lhs, const std::shared_ptr<Data> rhs) { if (lhs->detail->socre != rhs->detail->socre) return lhs->detail->socre > rhs->detail->socre; return lhs->detail->update_time < rhs->detail->update_time; } std::vector<std::shared_ptr<Data>> vec; std::sort(vec.begin(), vec.end(),compare_function);
也就是说,比较的时候有两个比较顺序,先比较score, 而后比较 update_time(当时时间戳:秒)。
凑巧的是,外网日志显示,第一名和第二名的不仅 score 相等,而且 update_time 也相等。需要比较的两个key都相等。这个地方会不会是导致问题的根源?