2012-12-21 8 views
29

私は、なぜ誰もがこれを書くと、思っていた。これに代えてiter_swapのポイントは何ですか?

std::iter_swap(i, k); 

std::swap(*i, *k); // saved a few keystrokes! 

は、その後、私はiter_swapの実装に見て、私たちは、とにかく、namespace stdですでにしているので、もちろんそれだけでswapの代わりstd::swapを使用しています。これに代えて

using std::swap; 
swap(a, b); 

なぜ誰もがこれを記述します。それは、次の質問に私をリード?

std::iter_swap(&a, &b); // saved an entire line of code! 

私はここで見落としている重要な相違点はありますか?

+1

コードを保存する価値があるかもしれません(複雑さを軽減するのは簡単です)...コードの*行*を保存しますか?非常に役に立たず、しばしば反生産的です。 –

+2

いいえいいえ、あなたは 'std :: iter_swapを使って'をする必要があります。 iter_swap(i、k); 'iter_swapは特殊化されている可能性があるためです。 (ちょっと冗談だと思うよ。) – Potatoswatter

+3

'iter_swap'の実装を見てきましたが、なぜそれを' std :: swap'で実装できないと思いますか? –

答えて

33

SGIドキュメント(here)から:

[1]厳密に言えば、iter_swapは冗長です。これは技術的な理由からのみ存在します。状況によっては、スワップ(* a、* b)の解釈に必要な型式控除を実行するのが難しいコンパイラがあります。

10

あなたの2番目の質問に答えるために、using + swapは、コンパイラが(ADLを使用して)デフォルトの実装よりも効率的な場合があり、ユーザー定義のスワップ機能を使用することができます。 std::swapと明示的に言っているのは、ADLやカスタムスワップの方法を妨げている可能性があります。

iter_swapについては、おそらくテンプレートで使用し、ポインタを期待していることを示す可能性のあるスワップではなく、意図を明確に示しています。

+0

ああ、私はフレッドがADLとスワップのイディオムを知っていると確信しているので、これを無視しました:) – sehe

+0

私の2番目の質問で 'std :: swap'を呼び出しました。私の指摘は、 'std :: iter_swap'も' using'ステートメントを書かなくてもユーザ定義のスワップを拾うということでした。右? – fredoverflow

+1

@FredOverflow:しかし、ユーザ定義のiter_swapはありません;) – MSalters

関連する問題