2

値の数でマルチマップを並べ替えるのを手伝ってください。

例えば、

multimap<char,int> mymultimap;

mymultimap.insert (pair<char,int>('a',100));
mymultimap.insert (pair<char,int>('a',101));
mymultimap.insert (pair<char,int>('a',111));
mymultimap.insert (pair<char,int>('b',200));
mymultimap.insert (pair<char,int>('b',211));
mymultimap.insert (pair<char,int>('c',300));

次の順序で並べ替えた後でなければなりません。

c
b
a

私は次のようなカスタム比較ツールを使用しようとしました:

struct comparer
{
    bool operator() (const char& first, const char& second) const
    {
        return mymultimap.count(first) < mymultimap.count(second);
    }
};

しかし、私は定義することはできません

multimap<char, int, comparer> mymultimap;

struct comparerが定義される前。

4

2 に答える 2

5

これは不可能です。

先に進んでカスタム構造を作成しない限り、すべての項目 (ここではペア) を追跡するために 1 つの構造が必要であり、実際にそれらをカウントするために 1 つの構造が必要であるように思われます。

実際の選択は主に、並べ替え操作が 1 回限りの計算であるか、実際に両方の同期を維持する必要があるかによって異なります。

1 回限りの計算の場合は、必要なときに数えるだけで済みます。

この順序を維持する必要がある場合は、Boost.MultiIndex を読み、それをベースとして使用してカスタム クラスを開発することをお勧めします。

于 2012-05-24T11:20:27.493 に答える
1

これは不可能です。比較子には、2 つのものが比較される場合、常に一貫して比較されるという制限があります。例: 'a' が 'b' より小さい場合、これは常に true でなければなりません。

マルチマップにさらに「a」または「b」を追加すると、比較の結果が突然変化する可能性があるため、比較子ではこのルールを破ります。

multimap は比較子を使用して、その要素をメモリに格納する方法を整理します。2 つの要素がある方法で比較し、突然別の方法で比較できる場合、マルチマップ内の要素の構成全体を変更する必要があります。multimap は、新しい要素を 1 つだけ挿入した場合に既存のコンテンツをすべて再配置するようには実装されていません。これは非常に非効率的です。

于 2012-05-24T11:36:30.450 に答える