2009-10-16 9 views
6

Potrzebuję sposobu na utworzenie ciągu znaków. W tym przypadku wartość ascii zero.Standardowy szablon Klasa string: string.fill()

wiem, że mogę to zrobić poprzez wywołanie konstruktora:

ciąg sTemp (125000, 'a');

ale chciałbym ponownie użyć sTemp w wielu miejscach i wypełnić go różnymi długościami.

Wywołuję bibliotekę, która pobiera wskaźnik łańcuchowy i długość jako argument i wypełnia ciąg bajtami. (Wiem, że ciąg technologiczny nie jest ciągły, ale dla wszystkich celów i celów jest i wkrótce stanie się standardem). NIE chcę używać wektora.

Czy istnieje jakiś sprytny sposób wywołania konstruktora ponownie po utworzeniu ciąg?

Odpowiedz

12

Klasa udostępnia metodę assign, która nadaje danemu ciągowi nową wartość. Podpisy są

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

Powołując źródło: (. Polecam tę stronę, ponieważ daje bardzo opracowany odniesienie do C++ standardowych bibliotek) cplusplus.com

myślę szukasz czegoś podobnego do piątego z następujących funkcji: n określa żądaną długość ciągu znaków i c znak wypełniony w tym ciągu. Na przykład, jeśli napiszemy

Twój łańcuch zostanie wypełniony wyłącznie znakami 10 b.

Pierwotnie zasugerowałem użycie algorytmu STL std::fill, w związku z czym długość łańcucha pozostanie niezmieniona. Metoda string::resize zapewnia sposób zmiany rozmiaru napisu i wypełnienia dołączonych znaków o podaną wartość - ale tylko te z dołączonymi są ustawione. Nareszcie string::assign pozostaje najlepszym podejściem!

+0

głosowanie Dlaczego w dół? Proszę zostawić przynajmniej komentarz z powodu. Tylko w ten sposób można się uczyć! – phlipsy

+0

Nie spadłem, ale nie chcę innego #include, jeśli to możliwe. –

+0

Jak zauważyłeś, wypełnienie nie jest dobre, ponieważ nie pozwala zmienić rozmiaru napisu. resize używa początkowego znaku tylko do zainicjowania nowych znaków w ciągu znaków (po zmianie rozmiaru). Tysiąc oryginalnych ciągów pozostaje niezmodyfikowanych. Nie są one zgodne z pożądanym efektem "wywołaj ponownie konstruktora". Właściwą funkcją jest przypisać. –

3

spróbuje użyć:

sTemp.resize(newLength, 'a'); 

Referencje:

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

Powiedzenie "to jest po" jest mylące. To jedna z realizacji. – GManNickG

+0

Masz rację, przeformułowałem. –

+0

Również jest to niewłaściwa funkcja zmiany rozmiaru :) – GManNickG