在c字符串中,我們需要分配合理大小的內存。爲了避免在字符串操作中重新分配,我們可以在C#或Java中使用類似Stringbuilder的東西,或者在C中 - 只爲字符串分配更多的內存。但是如果我們事先不知道內存需求,它仍然會成爲一個問題。我們有像鏈表一樣的實現嗎?我的意思是要分配的內存和方法c_str()
塊列表,它從它的節點作爲鏈表的C字符串?
liststring a(4); // requested block size
a.append("hello ");
a.append("world");
// should create three nodes, 4 bytes allocated for each
// "hell" -> "o wo" -> "rld"
a.c_str(); // "hello world";
創建C-字符串或者我們用另一種方法,如果我們想避免重新分配?請說明這是不是個好主意。
當你調用c_str()時,你需要將字符串放入連續的內存緩衝區,所以通常認爲從一開始就這樣做是個好主意。使用固定大小的塊的鏈表也意味着構建一個長字符串將花費O(n)進行分配,而通常的字符串指數增長分配策略花費O(log(n))的代價是浪費更多的內存。 – 2012-02-23 19:48:57
但是,如果我們想追加很多次,並且我們不知道有多少和多少大小,我們可能會分配太少的字節(因此需要重新分配)或太多(浪費內存)。 – 2012-02-23 19:53:53
有一種算法保證不使用超過四倍字符串長度的內存,每次重新分配平均需要'O(1)'次。如果緩衝區的當前大小爲「n」,並且字符串的長度超出緩衝區,則應該重新分配「2 * n」大小的緩衝區。如果它小於'n/4',那麼'n/2'大小的緩衝區應該被重新分配。 – citxx 2012-02-23 20:01:08