Supongamos que queremos aplicar una serie de transformaciones, int f1(int)
, int f2(int)
, int f3(int)
, a una lista de objetos. Una forma ingenua seríaC++ 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);
Esta primera solución no es óptima debido a la necesidad de espacio adicional con temp1
y temp2
. Por lo tanto, vamos a ser más inteligentes con esto:
int f123(int n) { return f3(f2(f1(n))); }
...
SourceContainer source;
TargetContainer target;
transform(source.begin(), source.end(), back_inserter(target), f123);
Esta segunda solución es mucho mejor porque no sólo el código es más simple pero más importante aún hay menos necesidad de espacio sin los cálculos intermedios.
Sin embargo, la composición f123
se debe determinar en tiempo de compilación y, por lo tanto, se fija en tiempo de ejecución.
¿Cómo trataré de hacer esto de manera eficiente si la composición se va a determinar en tiempo de ejecución? Por ejemplo, si este código estaba en un servicio RPC y la composición real, que puede ser cualquier permutación de cualquier subconjunto de f1
, f2
y f3
, se basa en argumentos de la llamada RPC.
+1 Me encantaría ver lo que las personas proponen – templatetypedef
Usted sabe que puede 'transformar' en su lugar, ¿verdad? –
En este ejemplo, utilicé 'SourceContainer' y' TargetContainer', pero los iteradores podrían proceder de input-stream y output-stream, que no pueden transformarse en su lugar. – kirakun