Supponiamo di voler applicare una serie di trasformazioni, int f1(int)
, int f2(int)
, int f3(int)
, a un elenco di oggetti. Un modo semplice sarebbeC++ Iterator Pipelining Designs
SourceContainer source;
TempContainer1 temp1;
transform(source.begin(), source.end(), back_inserter(temp1), f1);
TempContainer2 temp2;
transform(temp1.begin(), temp1.end(), back_inserter(temp2), f2);
TargetContainer target;
transform(temp2.begin(), temp2.end(), back_inserter(target), f3);
Questo prima soluzione non è ottimale a causa del requisito di spazio extra con temp1
e temp2
. Quindi, andiamo più intelligente con questo:
int f123(int n) { return f3(f2(f1(n))); }
...
SourceContainer source;
TargetContainer target;
transform(source.begin(), source.end(), back_inserter(target), f123);
Questa seconda soluzione è molto meglio perché non solo il codice è più semplice ma ancora più importante c'è meno necessità di spazio senza i calcoli intermedi.
Tuttavia, la composizione f123
deve essere determinata al momento della compilazione e pertanto viene fissata in fase di esecuzione.
Come potrei provare a farlo in modo efficiente se la composizione deve essere determinata in fase di esecuzione? Ad esempio, se questo codice era in un servizio RPC e la composizione effettiva - che può essere una permutazione di qualsiasi sottoinsieme di f1
, f2
e f3
- è basata su argomenti della chiamata RPC.
+1 Mi piacerebbe guarda cosa viene fuori la gente. – templatetypedef
Sai che puoi "trasformare" sul posto, giusto? –
In questo esempio, ho usato 'SourceContainer' e' TargetContainer', ma gli iteratori potrebbero provenire da input-stream e output-stream, che non possono essere trasformati in posizione. – kirakun