我有一个std :: multiset排序的自定义对象。多集中的两个相等对象(基于<运算符)可能包含一些不相等的字段。在这种情况下,我需要维护多个集合<>中对象的插入顺序。
我知道如果我使用的是C ++ 11,这不是问题,但我们现在还没有。
我看到的另一个解决方案是使用<ctime>
在类中使用时间戳字段,但分辨率为1秒。如果我在同一秒内有2个插入,那么我无法在比较操作中使用时间戳。我们不能/不能在这个项目中使用boost :: chrono。
我可以使用另一种方法来确保维持广告订单顺序吗?
答案 0 :(得分:1)
我只使用一个计数器,每次插入一个新项目时都会递增,并在插入时将其用作比较的最后一个字段。在典型情况下,您需要使计数器成为管理集合的类的静态成员。
答案 1 :(得分:1)
这是一个疯狂的想法:正如@Jerry建议的那样,保持一个反击。由于这对对象和计数器是唯一的,我们现在可以使用一组(按字典顺序排列)。然后我们使用lower_bound
来查找插入点并计算下一个计数器值:
unsigned int const uimax = std::numeric_limits<unsigned int>::max();
typedef std::set<std::pair<T, unsigned int>> pair_set;
void counted_insert(pair_set & s, T const & t)
{
pair_set::iterator it = s.lower_bound(std::make_pair(t, uimax));
if (it == s.begin() || !(*--it == t))
{
s.insert(it, std::make_pair(t, 0));
}
else
{
s.insert(it, std::make_pair(t, it->first + 1));
}
}