2

セットの共通部分、和集合、および差を計算しています。セットタイプのtypedefがあります:

typedef set<node_type> node_set;

に置き換えた場合

typedef hash_set<node_type> node_set;

結果は異なります。これは複雑なプログラムであり、デバッグを開始する前に、正しく実行していますか?私がこのような機能を使うとき:

set_intersection(v_higher.begin(), v_higher.end(), neighbors[w].begin(), neighbors[w].end(), 
            insert_iterator<node_set>(tmp1, tmp1.begin()));
  • setとhash_setの両方でシームレスに動作する必要がありますか?
4

3 に答える 3

5

私はそうは思わない。

の前提条件の1つset_intersectionは次のとおりです。

  • [first1, last1)に従って昇順で並べ替えられoperator<ます。つまり、イテレータのすべてのペアについて、およびのi前にあるものはfalseです。j[first1, last1)ij*j < *i

hash_setおよびunordered_set)は順序付けされていないため、順序付けされた条件を満たせません。

sを交差させる方法については、tr1::unordered_setの和集合と共通部分を参照してくださいunordered_set

于 2010-03-12T20:09:45.090 に答える
1

私はノーで行くつもりです。hash_setこれは標準のC++ではなく、今後もサポートされなくなる古い拡張機能であることに注意してください。新しい「ハッシュマップ」はと呼ばれunordered_setunordered_mapTR1、Boost、およびC++0xで使用できます。

いいえの理由set_intersectionは、入力データを並べ替える必要があるためです。逆に、ハッシュマップが非常に高速である理由は、順序付けをあきらめるためです。これは明らかに、という名前でより顕著になりますunordered_set。したがって、前提条件を確実に満たすことはできません。

于 2010-03-12T20:11:10.033 に答える
0

set_intersectionいいえ、2セットを注文する必要があるためset_intersection(同じ注文を使用して)使用できません。ハッシュセットは決して注文されません。C ++ 0xでは、実際にはと呼ばれunordered_setます。

于 2010-03-12T21:08:17.857 に答える