2009-05-25 25 views
65

これは簡単な質問だと思います。もちろんstd :: back_inserter for std :: set?

std::set<int> s1, s2; 
s1 = getAnExcitingSet(); 
std::transform(s1.begin(), s1.end(), std::back_inserter(s2), ExcitingUnaryFunctor()); 

、何push_backはありませんので、std::back_inserterが動作しない:私はこのような何かをする必要があります。 std::inserterにもイテレータが必要ですか?私はstd::inserterを使用していないので、何をすべきか分かりません。

アイデアはありますか?


もちろん、私の他の選択肢は、 s2のベクトルを使用し、後でそれを並べ替えるだけです。多分それは良いですか?

答えて

98

setは、要素の位置がセットのコンパレータによって決定されるため、push_backはありません。 std::inserterを使用し、それを.begin()を渡す:

std::set<int> s1, s2; 
s1 = getAnExcitingSet(); 
transform(s1.begin(), s1.end(), 
      std::inserter(s2, s2.begin()), ExcitingUnaryFunctor()); 

xがそれに書かれたときに、イテレータに渡された値です挿入反復子は、その後s2.insert(s2.begin(), x)を呼び出します。このセットは、イテレータを挿入するヒントとして使用します。あなたはよくs2.end()を使うことができます。

+0

std :: mapの作業も同様です(時間を保存しました。ありがとうございます)。 – FreeNickname

+1

'inserter(vec、vec.end())はベクトルに対しても機能するので、なぜ最初にback_inserterを使うのですか? – NHDaly

+5

@NHDaly:back_inserterがより速いので – marton78

関連する問題