【问题标题】:C-string as linked list?C字符串作为链表?
【发布时间】: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


【解决方案1】:

有关将字符串保存为树的数据结构,请参阅Ropes 上的文章。和你的想法差不多。

【讨论】:

  • 太好了,这正是我想要的!
【解决方案2】:

没有标准的方法可以做到这一点。但是您可以实现自己的字符链表并转换为 C 字符串。

【讨论】:

    【解决方案3】:

    我假设您的意思是 C++,而不是 C

    C++中字符串操作的标准类是std::string

    Java.NET 中的字符串类是不可变的。另一方面,std::string 是可变的,因此它的行为与 StringBuilder 完全相同。

    【讨论】:

    • 不,我的意思是 C,但 C++ 也可以。 std::string 没有提供我想要的功能。还是这样?
    • 可能不是,因为我知道的所有实现在内存中都是连续的。请参阅 AShelly 的回答:这就是您要找的。​​span>
    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2021-12-16
    相关资源
    最近更新 更多