Quiero insertar espacios 'n' (o cualquier cadena) al comienzo de una cadena en C ++. ¿Hay alguna forma directa de hacer esto usando std :: strings o char * strings?
Por ejemplo, en Python simplemente podrías hacer
>>> "." * 5 + "lolcat"
'.....lolcat'
Respuestas:
En el caso particular de repetir un solo carácter, puede usar
std::string(size_type count, CharT ch)
:NÓTESE BIEN. Esto no se puede usar para repetir cadenas de caracteres múltiples.
fuente
No hay una forma idiomática directa de repetir cadenas en C ++ equivalentes al operador * en Python o al operador x en Perl. Si está repitiendo un solo carácter, el constructor de dos argumentos (como lo sugirieron las respuestas anteriores) funciona bien:
Este es un ejemplo artificial de cómo puede usar un ostringstream para repetir una cadena n veces:
Dependiendo de la implementación, esto puede ser un poco más eficiente que simplemente concatenar la cadena n veces.
fuente
Use una de las formas de string :: insert:
Esto insertará "....." (cinco puntos) al comienzo de la cadena (posición 0).
fuente
Sé que esta es una vieja pregunta, pero estaba buscando hacer lo mismo y he encontrado lo que creo que es una solución más simple. Parece que cout tiene esta función incorporada con cout.fill (), vea el enlace para obtener una explicación 'completa'
http://www.java-samples.com/showtutorial.php?tutorialid=458
salidas
fuente
cout << "" << endl;
A los efectos del ejemplo proporcionado por la OP std :: ctor de cadena es suficiente:
std::string(5, '.')
. Sin embargo, si alguien está buscando una función para repetir std :: string varias veces:fuente
Como aludió el comodoro Jaeger, no creo que ninguna de las otras respuestas realmente responda esta pregunta; la pregunta pregunta cómo repetir una cadena, no un carácter.
Si bien la respuesta dada por Commodore es correcta, es bastante ineficiente. Aquí hay una implementación más rápida, la idea es minimizar las operaciones de copia y las asignaciones de memoria haciendo crecer primero la cadena exponencialmente:
También podemos definir un
operator*
para acercarnos a la versión de Python:En mi máquina, esto es aproximadamente 10 veces más rápido que la implementación dada por Commodore, y aproximadamente 2 veces más rápido que una solución ingenua de 'agregar n - 1 veces' .
fuente
+=
dentro de su bucle for también tiene un bucle de algún tipo que realizastr.size()
iteraciones.str.size()
crece en cada iteración del bucle externo, por lo que después de cada iteración externa, el bucle interno tiene que hacer más iteraciones. Tu y la ingenua implementación de 'copiar n veces' en total ambosn * period
caracteres de copia . Su implementación solo asigna una memoria debido a la inicialreserve
. Supongo que perfilaste tu implementación con una pequeñastr
y una granden
, pero no también con una grandestr
y una pequeñan
.str
y pequeñosn
entre los dos enfoques. Creo que esto tiene más que ver con la tubería general que con la predicción de rama en sí, también hay problemas de alineación de datos a considerar. Debería hacer una nueva pregunta para los detalles de por qué esto es más amigable con el procesador / memoria, estoy seguro de que ganaría mucho interés y recibiría una mejor respuesta de la que puedo dar aquí.rep movsb
es una de las formas más eficientes de copiar, al menos para copias medianas a grandes. Su implementación microcodificada tiene una sobrecarga de inicio casi constante (tanto en AMD como en Intel), por ejemplo, en Sandybridge, ~ 15 a 40 ciclos, más 4 ciclos por línea de caché de 64B (el mejor de los casos) . Para copias pequeñas, un bucle SSE es mejor porque no tiene la sobrecarga de inicio. Pero luego está sujeto a predicciones erróneas de la rama.Deberías escribir tu propio manipulador de flujo
fuente
ITNOA
Puede usar la función C ++ para hacer esto.
fuente