2009-10-16 4 views
6

Ho bisogno di un modo per creare una stringa di n caratteri. In questo caso ascii valore zero.Classe stringa: string.fill()

so che posso farlo chiamando il costruttore:

stringa sTemp (125000, 'a');

ma mi piacerebbe riutilizzare sTemp in molti posti e riempirlo con diverse lunghezze.

Sto chiamando una libreria che accetta un puntatore di stringa e una lunghezza come argomento e riempie la stringa con byte. (So ​​che tecnicamente la stringa non è contigua, ma a tutti gli effetti è, e presto diventerà lo standard). NON voglio usare un vettore.

c'è qualche modo intelligente per chiamare di nuovo il costruttore dopo che la stringa è stata creata?

risposta

12

La classe string fornisce il metodo assign per assegnare a una determinata stringa un nuovo valore. Le firme sono

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); 

Citando fonte: (. Consiglio questo sito perché ti dà un elaborato di riferimento del C++ le librerie standard) cplusplus.com

Penso che tu sia alla ricerca di qualcosa di simile al quinto di queste funzioni: n specifica la lunghezza desiderata della stringa e c il carattere inserito in questa stringa. Ad esempio, se scrivi

sTemp.assign(10, 'b'); 

la stringa verrà riempita esclusivamente con 10 b.

Inizialmente ho suggerito di utilizzare l'algoritmo STL std::fill ma la lunghezza della stringa rimane invariata. Il metodo string::resize fornisce un modo per modificare le dimensioni della stringa e riempie i caratteri aggiunti con un determinato valore, ma solo quelli aggiunti sono impostati. Infine, string::assign rimane l'approccio migliore!

+0

voto Perché verso il basso? Si prega di lasciare almeno un commento con il motivo. Solo così si può imparare! – phlipsy

+0

Non ho fatto downvote, ma non voglio altro #include se possibile –

+0

Come hai notato, il riempimento non è buono perché non consente di cambiare la dimensione della stringa. ridimensiona usa il carattere iniziale solo per inizializzare nuovi caratteri nella stringa (dopo il ridimensionamento). Quella stringa originale rimane non modificata. Quelli non sono coerenti con l'effetto desiderato di "chiamare di nuovo il costruttore". La funzione corretta è assegnata. –

3

Prova d'uso:

sTemp.resize(newLength, 'a'); 

Riferimenti:

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

Dire "è il seguente" è fuorviante. Questa è una implementazione. – GManNickG

+0

Hai ragione, ho riformulato. –

+0

Inoltre, questa è la funzione di ridimensionamento errata :) – GManNickG

Problemi correlati