2009-10-16 82 views
6

我需要一種方法來創建一個n個字符的字符串。在這種情況下,ascii值爲零。標準模板字符串類:string.fill()

我知道我可以通過調用構造做到這一點:

串STEMP(125000, 'A');

但我想在很多地方重複使用sTemp,並用不同的長度填充它。

我正在調用一個庫,它將字符串指針和長度作爲參數,並用字節填充字符串。 (我知道技術上字符串不是連續的,但是對於所有的意圖和目的來說,它很快就會成爲標準)。我不想使用矢量。

是否有一些聰明的方法來創建字符串後再次調用構造函數?

回答

12

string類提供方法assign爲給定字符串分配一個新值。該簽名是

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

引用來源:(我推薦這個網站,因爲它可以讓你的C++標準庫非常詳細說明參考)cplusplus.com

我認爲你在尋找類似的五分之一這些函數的功能如下:n指定所需的字符串長度和c字符填充到此字符串中。例如,如果你寫

sTemp.assign(10, 'b'); 

你的字符串將被完全填充10 b。

我最初建議使用STL算法std::fill,但是因此您的字符串長度保持不變。方法string::resize提供了一種方法來改變字符串的大小和填充給定值的附加字符 - 但只有附加的字符被設置。最後string::assign保持最佳的方法!

+0

爲什麼反對投票?請留下至少一條評論。只有這樣,人們才能學習! – phlipsy 2009-10-16 07:06:05

+0

我沒有downvote,但我不想要另一個#include如果可能 – 2009-10-16 07:15:10

+0

正如你所看到的填充不好,因爲它不允許改變字符串的大小。調整大小僅使用初始字符來初始化字符串中的新字符(調整大小後)。原始的字符串保持不變。這些不符合「再次調用構造函數」的預期效果。正確的功能是分配。 – 2009-10-16 07:46:27

3

嘗試使用:

sTemp.resize(newLength, 'a'); 

參考文獻:

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

說「這是以下」是誤導。這是一個實現。 – GManNickG 2009-10-16 06:52:26

+0

你說得對,我換了話。 – 2009-10-16 06:54:29

+0

此外,這是錯誤的調整功能:) – GManNickG 2009-10-16 06:57:15