【发布时间】:2012-02-23 19:44:55
【问题描述】:
在 c-strings 中,我们需要分配合理大小的内存。为了避免在字符串操作中重新分配,我们可以使用 C# 或 Java 中的 Stringbuilder 之类的东西,或者在 C 中为字符串分配更多内存。但是,如果我们事先不知道内存需求,这仍然是一个问题。我们有像链表这样的实现吗?我的意思是分配内存块列表和方法c_str(),它从其节点创建c-string
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_str() 时,无论如何您都需要将字符串放入连续的内存缓冲区中,因此通常认为从一开始就这样做是个好主意。使用固定大小的块的链表也意味着构建一个长字符串将花费 O(n) 进行分配,而通常的字符串指数增加分配策略花费 O(log(n)) 以浪费更多内存为代价。
-
但是如果我们要追加很多次,又不知道多少次和多少大小,我们可能分配的字节太少(所以需要重新分配)或太多(浪费内存)。
-
有一种算法保证不使用超过四倍字符串长度的内存,并且每次重新分配平均需要
O(1)时间。如果缓冲区的当前大小为n并且字符串的长度超出缓冲区,则应重新分配2*n大小的缓冲区。如果它变得小于n / 4,则应重新分配n / 2大小的缓冲区。
标签: c string linked-list