我想知道在什么情况下你会在另一个STL容器上使用绳索?
答案 0 :(得分:39)
Ropes是一个可扩展的字符串 实施:它们是专为 有效的操作涉及到 字符串作为一个整体。诸如的操作 分配,连接和 子串需要几乎的时间 独立于长度 串。与C字符串不同,绳索是一种 合理的代表性 长字符串,如编辑缓冲区或 邮件消息。
<强>优点强>:
连接速度快得多 涉及long的子串操作 字符串。在中插入一个字符 中间的10兆字节绳索应该 采取10的顺序 微秒,即使是副本 保留原件,例如作为一部分 编辑历史。相反,这会 拿一秒钟的顺序 传统的“扁平”字符串 表示。所需的时间 连接可以被视为 大多数应用程序都是常它是 完全合理的使用绳索作为 一个文件的表示 文本编辑器。
可能更好的空间 性能。 a的微小修改 绳子可以分享记忆 原版的。绳索分配很小 块,显着减少内存 引入的碎片问题 大块
作业只是一个(可能是 引用计数)指针分配。 与引用计数的写时复制不同 实现,这仍然很大程度上 即使其中一个副本是真的,也是如此 随后略有修改。它是 检查站老了很便宜 字符串的版本,例如在编辑中 历史。
- 醇>
可以查看功能 把字符当成一根绳子。这样一个 一根绳子可能是100MByte 文件,只有在那时才能读取 检查字符串的一部分。 将字符串连接到结尾 这样的文件不涉及阅读 文件。 (目前是 这个设施的实施是 不完整的。)
https://wayback.archive.org/web/20130102093702/https://www.sgi.com/tech/stl/Rope.html
答案 1 :(得分:7)
它是处理大数据量的string
的非标准替代品。有关其工作原理,请参阅here。
答案 2 :(得分:3)
绳索唯一不好的是线程和误用。
在Linux(可能是大多数其他操作系统)下,据说线程安全代码使得绳索变得如此慢。所以我只是将代码翻出来(为 threads-off 设置编译器def),因为我在嵌入式平台中使用单个线程。
否则,绳索比字符串快得多,在大缓冲区中内存不足的可能性更小,并且对大缓冲区的编辑速度更快;比如在圣经中间删除一个坏人物。
这是由于绳索被解释为数据的方式。正如许多小的“字符串”通过链表一起链接在一起产生最终的字符串。
答案 3 :(得分:2)
我根本不会使用它,但那是因为我有点“易携带”怪物,而且往往只使用沼泽标准容器。该绳索是SGI STL实现的一部分,不属于C ++标准。
答案 4 :(得分:2)
这里有很多关于由字符组成的字符串的重点,但是rope只是一个快速插入和删除的序列(序列中的任何位置)。
似乎有点令人惊讶的是,除了字符串之外,很少需要这样的基本功能。我在哪里使用整数绳?我不知道,因为操纵它需要索引来自某个地方。
最好的设计实际示例是我在制作用户界面时让用户查看由数千张图片组成的数据集的位置,用户需要能够删除部分图像并重新排列其他人的顺序。