iterator an funktion uebergeben: per value oder per reference ?
-
hola leute
ich sah bis jetzt meistens das iteratoren an funktionen per value uebergeben werden und nicht per reference. hat das einen bestimmten grund ?
Meep Meep
-
Nö, im Prinzip ist es egal. Normalerweise übergibt man ja Referenzen, wenn nicht das ganze Objekt kopiert werden soll. Da Iteratoren aber recht simple Objekte sind (eigentlich nur Zeiger), würde man mit einer Referenz einen Zeiger auf einen Zeiger übergeben, mit call-by-value eben nur diesen Zeiger. Deshalb spielt es von der Performance keine Rolle und ist eher Geschmackssache.
Aber, nicht zu vergessen, oft möchte man ja, dass der Iterator unverändert bleibt, das wird mit einem Referenz-Iterator aber nicht garantiert.
Ich persönlich übergebe Iteratoren immer per value, außer der Callee (die aufgerufene Funktion) soll den Iterator forwarden
-
Badestrand schrieb:
Aber, nicht zu vergessen, oft möchte man ja, dass der Iterator unverändert bleibt, das wird mit einem Referenz-Iterator aber nicht garantiert.
Ja, das ist ein wichtiger Punkt - und gerade bei C++ Algorithmen wird der Parameter oft direkt als Schleifenzähler verwendet - den müsste man sich andernfalls kopieren, wodurch der Vorteil der Referenzübergabe verlorengeht:
typedef ... iter; iter find1(iter bg,iter en,int val) { for(;bg!=en;++bg) if(*bg == val) return bg; return en; } iter find2(const iter&bg,const iter&en,int val) { iter pos; for(pos=bg;pos!=en;++pos) if(*pos == val) return pos; return en; }(Der Vorteil der Referenz-Übergabe wäre es, daß bg nicht beim Aufruf kopiert werden müsste - den machst du dir gleich kaputt, indem du als erste Amthandlung bg kopierst. en könnte man eigentlich per Referenz übergeben, aber viel bringt das auch nicht)