【问题标题】:STL Rope - when and where to useSTL 绳索 - 何时何地使用
【发布时间】:2010-05-13 11:43:52
【问题描述】:

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

【问题讨论】:

  • 我从未听说过绳索——它是标准的吗?
  • 正如@Neil(和其他人)指出的那样——这不是标准的一部分,而是一个额外的容器,它是 SGI 库的一部分。
  • 你说得真好,我只是在想类似的野兽,同时想知道 Python 是如何实现其list 的。我认为他们使用了一些类似的技术来允许在其中快速插入/擦除。
  • 它可能不是标准的,但该实现在 STLPort 中免费提供,并且是使用 gcc 的 Linux 原生的。
  • WP 很好地概述了绳索的用途,以及哪些语言支持它:en.wikipedia.org/wiki/Rope_(computer_science) 看起来它有一些非常具体的用例来优化某些文本处理操作,例如例如文字处理/页面布局应用程序。

标签: c++ stl ropes


【解决方案1】:

绳索是可伸缩的字符串 实施:它们是为 有效的操作,涉及 字符串作为一个整体。操作如 赋值、连接和 子字符串花费的时间差不多 与长度无关 细绳。与 C 弦不同,绳索是 非常合理的代表 长字符串,例如编辑缓冲区或 邮件。

优势

  1. 更快的连接和 涉及长的子串操作 字符串。插入一个字符 10 兆字节绳索的中间应该 采取10s的顺序 微秒,即使是 保留原件,例如作为一个 编辑历史。相比之下,这将 大约一秒钟 传统的“扁平”字符串 表示。所需时间 串联可以看成 恒定的大多数应用程序。这是 使用绳索是完全合理的 文件在 a 中的表示 文本编辑器。

  2. 可能会更好的空间 表现。对a的小修改 绳子可以与 原来的。绳索被分配在小 块,显着减少内存 引入的碎片问题 大块

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

  4. 可以查看函数 把人物塑造成绳子。因此一个 一根绳子可能是 100MByte 文件,只有在那个时候才被读取 检查字符串的部分。 将字符串连接到末尾 这样的文件不涉及读取 文件。 (目前 该设施的实施是 不完整。)

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

【讨论】:

  • @user202729 替换为指向页面历史版本的回路机器链接
【解决方案2】:

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

【讨论】:

  • "a non-standard alternative to string" 比那个复杂一点 :( 它是 STL 的标准部分。尴尬的是它是 not 在C++ 标准库。C++ 标准库几乎是但不完全是 STL 的超集 :(
【解决方案3】:

绳索的唯一坏处是线和滥用。

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

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

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

【讨论】:

  • “绳索比字符串快得多”:并非适用于所有任务。通过索引检索绳索中的字符比使用绳索更快。
  • @Alexandre,但即使对于 std::string,这也是 不好的做法。在这种情况下,最好使用 char 向量。
  • C++0x 中的字符串保证连续存储字符,所以这不再是坏习惯。
  • 即使在 C++98 中 - 字符串也需要 &str[0] 是指向连续字符串的指针。因此,在任何情况下,每个实现都必须连续存储字符串数据。
  • 根据维基百科Rope is a binary tree,不涉及链表(这会渐近地变慢)。虽然在得知之前我也认为它是一个子字符串列表,通过想象绳索。
【解决方案4】:

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

【讨论】:

  • +1 这是我第一次读到它的地方,但没有意识到它不是标准的一部分。
  • 另一方面,也许只复制代码就那么容易?还是 SGI STL 许可证会阻止它?
  • -1 STLPort (libre/free) 和 libstdc++ (在 GNU 的 gcc 中) 都支持 。它是某些任务的必要课程,这是提问者所要求的。
  • STLPort license 似乎是非病毒性的,并且允许衍生作品,只要求提供归属通知。所以没有理由不使用它。 (虽然我会确保它应该通过的某个地方有适当的测试套件。)
【解决方案5】:

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

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

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

【讨论】:

  • 文本编辑器是绳索数据结构有用性的一个非人为的真实示例。
猜你喜欢
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多