40

我想知道在什么情况下你会在另一个 STL 容器上使用绳子?

4

5 回答 5

44

绳索是一种可扩展的字符串实现:它们是为将字符串作为一个整体进行高效操作而设计的。赋值、连接和子字符串等操作所花费的时间几乎与字符串的长度无关。与 C 字符串不同,绳索是非常长的字符串(例如编辑缓冲区或邮件消息)的合理表示。

优点

  1. 涉及长字符串的连接和子字符串操作要快得多。在 10 兆字节的绳索中间插入一个字符应该花费大约 10 微秒的时间,即使保留了原件的副本,例如作为编辑历史的一部分。相反,对于传统的“平面”字符串表示,这将花费大约一秒。对于大多数应用程序,连接所需的时间可以看作是恒定的。在文本编辑器中使用绳索作为文件的表示是完全合理的。

  2. 可能更好的空间性能。对绳索的微小修改可以与原始绳索共享内存。绳索以小块分配,显着减少大块引入的内存碎片问题

  3. 赋值只是一个(可能是引用计数的)指针赋值。与引用计数的写时复制实现不同,即使其中一个副本随后稍作修改,这在很大程度上仍然是正确的。检查字符串的旧版本是非常便宜的,例如在编辑历史中。

  4. 可以将产生字符的函数视为绳索。因此,一根绳子可能是一个 100MByte 的文件,只有在检查字符串的该部分时才能读取该文件。将字符串连接到此类文件的末尾不涉及读取文件。(目前该设施的实施不完整。)

https://wayback.archive.org/web/20130102093702/https://www.sgi.com/tech/stl/Rope.html

于 2010-05-13T11:46:44.080 回答
8

string它是处理大数据大小的非标准替代方案。请参阅此处了解其工作原理。

于 2010-05-13T11:46:11.823 回答
4

绳索唯一的坏处是螺纹和误用。

在 Linux(可能还有大多数其他操作系统)下,据说线程安全代码使绳索变得如此缓慢。所以我只是撕掉该代码(为threads-off设置编译器 def ),因为我在嵌入式平台中使用单个线程。

否则,绳索比字符串快得多,在大缓冲区上内存不足的可能性较小,并且对于大缓冲区的编辑要快得多;比如去掉圣经中间的一个坏字。

这是由于绳索被解释为数据的方式。许多较小的“字符串”通过链表链接在一起以生成最终字符串。

于 2011-03-24T01:30:04.543 回答
2

我根本不会使用它,但那是因为我有点“易于携带”的怪胎,并且倾向于只使用沼泽标准容器。绳索是 SGI 的 STL 实现的一部分,而不是 C++ 标准的一部分。

于 2010-05-13T11:48:31.320 回答
2

这里非常强调由字符组成的字符串,但rope 只是一个具有快速插入和删除(在序列中的任何位置)的一维序列。

任何东西(字符串除外)都很少需要这种基本功能,这似乎有点令人惊讶。我会在哪里使用整数绳?我不知道,因为操纵它需要索引来自某个地方。

最好的人为设计的真实示例是我正在制作一个 UI 以让用户查看由数千张图像组成的数据集,并且用户需要能够删除其中的一些并重新排列其他的顺序。

于 2016-05-03T23:11:26.010 回答