13

必要なのは、何かが存在するかどうかと、それが何回存在するかを知ることだけです。既存のものを繰り返し処理し、どれだけ存在するかを照会します。

これまでの実装では を使用しておりmultiset、次のようにします。

std::multiset<thing> a;
auto previous = a.end();
for( auto each = a.begin(); each != a.end(); ++each ) {
    if( previous == a.end() || *previous != *each ) {
        a.count(*each);
    }
    previous = each;
}

明確化

s のベクトルがありthingます。しかし、彼らは時々値を繰り返します。私は unique を反復処理し thing、それぞれの unique に対して何かをしたいと考えています。thingこの「何か」は、これがベクトルに表示される時間を知る必要があります。

上記のコードは、私が現在問題を解決している方法です。これは、私が望むことを行うための最もエレガントな方法ではないようです。

私は Stackoverflow のガイドラインに従っているだけです。私の問題は何かを伝え、(試した) 解決策を伝えます。

疑問符の付いた文が本当に必要な場合は、そこに行きます: a で一意の要素を反復処理する方法はありますmultisetか?

4

1 に答える 1

16

考えられる 3 つのアプローチ:

  • std::unique一意の値の一時的なコレクションを作成するために使用します。これにより、コードが少し読みやすくなりますが、効率が低下します。
  • std::multiset::upper_boundインクリメントではなく使用して、イテレータを進めfor( auto each = a.begin(); each != a.end(); each=a.upper_bound(*each))ます。すごいですね(調べるまで知りませんでした)。次の提案では、すべての功績は@MarkRansomにあります。 fromを使用すると、上限を探す範囲を指定できます。あなたの場合、その範囲の開始の適切な候補が既にあるため、標準ライブラリの実装によっては、この方法がより効率的である可能性があります。ifstd::upper_bound<algorithm>
  • これが実際のパフォーマンスの問題であり、以前の解決策がまだ十分でない場合は、に切り替えることを検討しmap<thing, unsigned>unordered_map<thing,unsigned>ください。ただし、挿入/削除コードを書き直すことを意味します。unsignedthing
于 2013-02-07T14:42:29.527 に答える