2012-12-21 15 views
29

Mi stavo chiedendo, perché qualcuno dovrebbe scrivere questo:Qual è il punto di iter_swap?

std::iter_swap(i, k); 

invece di questo?

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

Poi ho guardato dentro l'attuazione di iter_swap, e, naturalmente, utilizza solo swap invece di std::swap visto che siamo già in namespace std, in ogni caso. Questo mi porta alla prossima domanda:

Perché qualcuno dovrebbe scrivere questo:

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

invece di questo?

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

Ci sono differenze/problemi importanti che sto trascurando qui?

+1

Il codice di salvataggio può essere utile (una riduzione della complessità è più semplice da ragionare) ... ma il salvataggio di * linee * di codice? Assolutamente inutile, spesso controproducente. –

+2

No no no, è necessario eseguire 'using std :: iter_swap; iter_swap (i, k); 'perché' iter_swap' potrebbe essere specializzato. (Sto scherzando, credo.) – Potatoswatter

+3

Hai esaminato * un'implementazione * di 'iter_swap', ma perché ritieni che non possa essere implementata con' std :: swap'? –

risposta

33

Dalla documentazione SGI (here):

[1] In senso stretto, iter_swap è ridondante. Esiste solo per motivi tecnici: in alcune circostanze, alcuni compilatori hanno difficoltà a eseguire la deduzione del tipo richiesta per interpretare lo swap (* a, * b).

10

Per rispondere alla tua seconda domanda, la using + swap consente al compilatore di utilizzare le funzioni di swap definite dall'utente che possono essere più efficiente rispetto alla implementazione di default (utilizzando ADL). In modo esplicito, std::swap inibisce ADL e qualsiasi metodo di scambio personalizzato che è stato possibile trovare.

Per quanto riguarda iter_swap, è presumibilmente presente nei modelli e indica chiaramente l'intenzione piuttosto che uno scambio che potrebbe indicare che si aspetta un puntatore.

+0

Oh, ho trascurato questo perché sono assolutamente convinto che Fred conosca ADL e std :: swap idioms :) – sehe

+0

Non c'è invocazione 'std :: swap' nella mia seconda domanda. Il mio punto era che 'std :: iter_swap' recuperasse anche gli swap definiti dall'utente, senza dover scrivere un'istruzione' using'. Destra? – fredoverflow

+1

@FredOverflow: ma 'iter_swap's non definito dall'utente;) – MSalters