繁体   English   中英

STL 绳 - 何时何地使用

[英]STL Rope - when and where to use

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

绳索是一种可扩展的字符串实现:它们旨在用于涉及整个字符串的高效操作。 诸如赋值、连接和子字符串之类的操作所花费的时间几乎与字符串的长度无关。 与 C 字符串不同,绳索是非常长的字符串(例如编辑缓冲区或邮件消息)的合理表示。

优点

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

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

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM