vector<string> v(10, "foo");
string concat = accumulate(v.begin(), v.end(), string(""));
Este ejemplo es simplemente mala programación, en cualquier estándar de C++. Es equivalente a esto:
string tmp;
tmp = tmp + "foo"; //copy tmp, append "foo", then copy the result back into tmp
tmp = tmp + "foo"; //copy tmp, append "foo", then copy the result back into tmp
tmp = tmp + "foo"; //copy tmp, append "foo", then copy the result back into tmp
tmp = tmp + "foo"; //copy tmp, append "foo", then copy the result back into tmp
tmp = tmp + "foo"; //copy tmp, append "foo", then copy the result back into tmp
tmp = tmp + "foo"; //copy tmp, append "foo", then copy the result back into tmp
tmp = tmp + "foo"; //copy tmp, append "foo", then copy the result back into tmp
tmp = tmp + "foo"; //copy tmp, append "foo", then copy the result back into tmp
tmp = tmp + "foo"; //copy tmp, append "foo", then copy the result back into tmp
tmp = tmp + "foo"; //copy tmp, append "foo", then copy the result back into tmp
C++ 11 semántica moverse sólo se hará cargo de la "copia el resultado en tmp" parte de la ecuación. Las copias iniciales de tmp seguirán siendo copias. Es un clásico Schlemiel the Painter's algorithm, pero incluso peor que el ejemplo habitual utilizando strcat
en C.
Si accumulate
acaba de utilizar en lugar de +=
+
y =
entonces se habría evitado todas esas copias.
Pero C++ 11 nos da una manera de hacerlo mejor, sin dejar de ser conciso, utilizando una función lambda:
string concat;
for_each(v.begin(), v.end(), [&](const string &s){ concat += s; });
EDIT: supongamos que un implementador biblioteca estándar podría optar por aplicar accumulate
con movimiento en el operando a +
, entonces tmp = tmp + "foo"
se convertiría en tmp = move(tmp) + "foo"
, y eso resolvería bastante este problema. No estoy seguro si tal implementación sería estrictamente conforme. Ni GCC, MSVC ni LLVM lo hacen actualmente. Y como se define accumulate
en <numeric>
, se puede suponer que solo está diseñado para su uso con tipos numéricos.
Aquí hay alguna otra respuesta sobre el tema: http://stackoverflow.com/questions/637695/how-efficient-is-stdstring-compared-to-null-terminated-strings/637737#637737 –