维护std :: multiset中相等元素的插入顺序

时间:2012-11-02 20:12:18

标签: c++ stl multiset strict-weak-ordering

我有一个std :: multiset排序的自定义对象。多集中的两个相等对象(基于<运算符)可能包含一些不相等的字段。在这种情况下,我需要维护多个集合<>中对象的插入顺序。

我知道如果我使用的是C ++ 11,这不是问题,但我们现在还没有。

我看到的另一个解决方案是使用<ctime>在类中使用时间戳字段,但分辨率为1秒。如果我在同一秒内有2个插入,那么我无法在比较操作中使用时间戳。我们不能/不能在这个项目中使用boost :: chrono。

我可以使用另一种方法来确保维持广告订单顺序吗?

2 个答案:

答案 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));
    }
}