1

ソートされたカスタムオブジェクトのstd::multisetがあります。マルチセット内の2つの等しいオブジェクト(<演算子に基づく)には、等しくないフィールドが含まれている場合があります。その場合、マルチセット<>内のオブジェクトの挿入順序を維持する必要があります。

C ++ 11を使用している場合、これは問題ではないことはわかっていますが、現時点では問題ではありません。

私が見た別の解決策は、を使用するクラスのタイムスタンプフィールドを使用します<ctime>が、それは1秒の解像度を提供します。同じ秒に2つの挿入がある場合、比較操作でタイムスタンプを使用できません。このプロジェクトではboost::chronoを使用していません/使用できません。

挿入順序を確実に維持するために使用できる別の方法はありますか?

4

2 に答える 2

1

新しいアイテムを挿入するたびにインクリメントされるカウンターを使用し、それを挿入を行うときに比較する最後のフィールドとして使用します。通常の場合、カウンターをコレクションを管理するクラスの静的メンバーにする必要があります。

于 2012-11-02T20:15:32.600 に答える
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));
    }
}
于 2012-11-02T20:32:01.443 に答える