2009-10-16 6 views
6

Necesito una forma de crear una cadena de n caracteres. En este caso ascii valor cero.Plantilla estándar Clase de cadena: string.fill()

sé que puedo hacerlo llamando al constructor:

cadena sTemp (125000, 'a');

pero me gustaría reutilizar sTemp en muchos lugares y llenarlo con diferentes longitudes.

Llamo a una biblioteca que toma un puntero de cadena y una longitud como argumento y rellena la cadena con bytes. (Sé que técnicamente la cadena no es contigua, pero para todos los efectos es, y muy pronto se convertirá en el estándar). NO quiero usar un vector.

¿hay alguna forma ingeniosa de llamar al constructor una vez que se haya creado la cadena?

Respuesta

12

La clase string proporciona el método assign para asignar a una cadena dada un nuevo valor. Las firmas son

1. string& assign (const string& str); 
2. string& assign (const string& str, size_t pos, size_t n); 
3. string& assign (const char* s, size_t n); 
4. string& assign (const char* s); 
5. string& assign (size_t n, char c); 
6. template <class InputIterator> 
    string& assign (InputIterator first, InputIterator last); 

fuente citar: (. Recomiendo este sitio web, ya que le da referencia una muy elaborada del librerías de C++ estándar) cplusplus.com

pienso que usted está buscando algo así como el quinto de estas funciones: n especifica la longitud deseada de su cadena y c el carácter relleno en esta cadena. Por ejemplo, si escribe

sTemp.assign(10, 'b'); 

su cadena estará llena únicamente con 10 b.

Originalmente sugerí utilizar el algoritmo STL std::fill pero, por lo tanto, su longitud de cadena no cambia. El método string::resize proporciona una forma de cambiar el tamaño de la cadena y rellena los caracteres anexos con un valor determinado, pero solo se configuran los adjuntos. ¡Finalmente, string::assign se mantiene como el mejor enfoque!

+0

de votación ¿Por abajo? Por favor, deje al menos un comentario con el motivo. ¡Solo así se puede aprender! – phlipsy

+0

No he votado negativamente, pero no quiero otro #include si es posible –

+0

Como ha notado, el relleno no es bueno porque no permite cambiar el tamaño de la cadena. redimensionar usa el carácter inicial solo para inicializar nuevos caracteres en la cadena (después del redimensionamiento). Thous string original permanece sin modificaciones. Esos no son consistentes con el efecto deseado de "llamar al constructor de nuevo". La función correcta es asignar. –

3

Trate de usar:

sTemp.resize(newLength, 'a'); 

Referencias:

void __CLR_OR_THIS_CALL resize(size_type _Newsize) 
    { // determine new length, padding with null elements as needed 
    resize(_Newsize, _Elem()); 
    } 

void __CLR_OR_THIS_CALL resize(size_type _Newsize, _Elem _Ch) 
    { // determine new length, padding with _Ch elements as needed 
    if (_Newsize <= _Mysize) 
     erase(_Newsize); 
    else 
     append(_Newsize - _Mysize, _Ch); 
    } 
+1

Decir "es lo siguiente" es engañoso. Esa es una implementación. – GManNickG

+0

Tienes razón, reformulé. –

+0

Además, esa es la función de ajuste de tamaño incorrecta :) – GManNickG

Cuestiones relacionadas