2009-10-16 24 views
6

N karakter dizisi oluşturmanın bir yoluna ihtiyacım var. Bu durumda ascii değeri sıfırdır.Standart Şablon Dize sınıfı: string.fill()

Ben yapıcı arayarak bunu biliyorum:

dize sTemp (125000, 'a');

ama birçok yerde STEMP yeniden ve farklı uzunluklarda ile doldurmak istiyorum.

Ben bağımsız değişken olarak bir dize işaretçisi ve uzunluğunu alır ve bayt ile dize doldurur bir kütüphane arıyorum. (Teknik olarak dizgenin bitişik olmadığını biliyorum, ancak tüm niyet ve amaçlar için öyle ve yakında standart olacak). Bir vektör kullanmak istemiyorum.

dize oluşturulduktan sonra tekrar kurucusunu çağırmak için bazı akıllı yol var?

cevap

12

string sınıf belirli bir dize yeni bir değer atamak için yöntem assign sağlar. imzalar

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

şunlardır gerekçe kaynak: (. bu size standart kütüphaneler C++ çok özenli bir referans verir çünkü bu web sitesini tavsiye) cplusplus.com

Sana beşinci gibi bir şey arıyoruz düşünüyorum Bu işlevlerin: n, dizenizin istenen uzunluğunu ve c bu dizeye doldurulmuş karakteri belirtir. Örneğin

sTemp.assign(10, 'b'); 

yazarsanız dize yalnızca 10 b yıllardan ile doldurulacaktır.

Başlangıçta STL algoritması std::fill kullanmayı öneriyoruz böylece dize uzunluğu değişmeden kalır. string::resize yöntemi, dizenin boyutunu değiştirmenin ve eklenen karakterleri belirli bir değerle doldurmanın bir yolunu sağlar; ancak yalnızca eklenmiş olanlar ayarlanır. Son olarak string::assign en iyi yaklaşımdır!

+0

Neden aşağı oylama? Lütfen sebeple en azından bir yorum bırakın. Sadece bu şekilde öğrenebilirsiniz! – phlipsy

+0

Ben downvote yoktu, ama ben bunu dize boyutunu değiştirmek için izin vermediği için dolgu iyi değil fark Mümkün –

+0

eğer başka #include istemiyorum. yeniden boyutlandırma, yalnızca başlangıç ​​karakterini dizgedeki yeni karakterleri (yeniden boyutlandırdıktan sonra) başlatmak için kullanır. Thous orijinal dizesi değiştirilmemiş olarak kalır. Bunlar "kurucuyu tekrar çağır" ın istenen etkisi ile tutarlı değildir. Doğru işlev atanır. –

3

deneyin kullanmak:

sTemp.resize(newLength, 'a'); 

Referanslar:

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

"Aşağıdakiler" demek yanıltıcıdır. Bu bir uygulama. – GManNickG

+0

Haklısınız, ben yeniden yazdım. –

+0

Ayrıca, bu yanlış yeniden boyutlandırma işlevi :) – GManNickG

İlgili konular