c++ - template - Prepend std:: string
string interpolation javascript (4)
En realidad, existe una función similar a la std::string::push_front
no existente, consulte el ejemplo siguiente.
Documentación de std :: string :: insert
#include <iostream>
#include <string>
int
main (int argc, char *argv[])
{
std::string s1 (" world");
std::string s2 ("ello");
s1.insert (0, s2); // insert the contents of s2 at offset 0 in s1
s1.insert (0, 1, ''h''); // insert one (1) ''h'' at offset 0 in s1
std::cout << s1 << std::endl;
}
salida:
hello world
Como anteponer una cadena con datos puede requerir tanto la reasignación como la copia / movimiento de datos existentes, puede obtener algunos beneficios de rendimiento al deshacerse de la parte de reasignación utilizando std::string::reserve
(para asignar más memoria manualmente).
La copia / movimiento de datos es tristemente inevitable, a menos que defina su propia clase personalizada que actúa como std::string
que asigna un gran búfer y coloca el primer contenido en el centro de este búfer de memoria.
Entonces puede anteponer y anexar datos sin reasignar y mover datos, si el búfer es lo suficientemente grande. Sin embargo, aún es obligatorio realizar copias desde el origen hasta el destino .
Si tiene un búfer en el que sabe que va a anteponer los datos con más frecuencia de la que agrega, una buena alternativa es almacenar la secuencia al revés e invertirla cuando sea necesario (si es más raro).
¿Cuál es la forma más eficiente de anteponer std::string
? ¿Vale la pena escribir una función completa para hacerlo, o solo tomaría 1 - 2 líneas? No veo nada relacionado con std::string::push_front
.
Hay un string operator+ (char lhs, const string& rhs);
sobrecargado string operator+ (char lhs, const string& rhs);
, así que puedes hacer your_string ''a'' + your_string
para imitar push_front
.
Esto no está en su lugar, pero crea una nueva cadena, así que no esperes que sea eficiente. Para una solución (probablemente) más eficiente, use resize
para juntar espacio, std::copy_backward
para cambiar toda la cadena por una e insertar el nuevo carácter al principio.
Si está usando std::string::append
, debe saber que lo siguiente es equivalente:
std::string lhs1 = "hello ";
std::string lh2 = "hello ";
std::string rhs = "world!";
lhs1.append(rhs);
lhs2 += rhs; // equivalent to above
// Also the same:
// lhs2 = lhs + rhs;
Del mismo modo, un "anteponer" sería equivalente a lo siguiente:
std::string result = "world";
result = "hello " + result;
// If prepend existed, this would be equivalent to
// result.prepend("hello");
Sin embargo, debes tener en cuenta que es bastante ineficiente hacer lo anterior.
myString.insert(0, otherString);
Permita que los escritores de la Biblioteca de plantillas estándar se preocupen por la eficiencia; hacer uso de todas sus horas de trabajo en lugar de reprogramar la rueda.
De esta manera hace ambas cosas.
Siempre que se haya pensado en la implementación de STL que está utilizando, tendrá un código eficiente. Si está utilizando un STL mal escrito, de todas maneras tiene problemas mayores :)