std :: strings是否适合随机插入/随机擦除?

时间:2011-03-15 16:42:02

标签: c++ string

我想使用std :: strings创建一个简单的文本编辑器。如果我的文本是500,000个字符,并且我想在第253,000个字符处插入或删除,这会很慢,还是会像我的文本包含10个字符一样快?否则,我不确定我要做些什么来解决它(除非我使用链接列表但是阅读速度很慢,这有点重新发明轮子。

由于

7 个答案:

答案 0 :(得分:5)

我自己从未使用过它,但我相信这是rope的用途。

答案 1 :(得分:1)

由于必须复制内存,因此可能会很慢。这取决于操作系统/处理器的内部实现及其内存操作。

答案 2 :(得分:1)

在实践中,它可能“足够快”。但是,我 仍然编写一个EditBuffer类,封装它,并给予 这个新类是一个调整到我的应用程序的界面。那样, 我正在使用std :: string,而不是其他东西, 成为EditBuffer的实现细节,可以是 随时改变了。 (你可能想尝试std :: vector 同样。一个常见的优化是保持一个洞 游标:光标后面的文本位于结尾处 缓冲。推进光标意味着移动一个角色,但是 插入通常是在不变的时间。)

答案 3 :(得分:0)

它可能会很慢,但是它是否足够缓慢成为一个问题是你必须要测试的东西。一种替代实现是使用字符串列表,每行文本一个。

答案 4 :(得分:0)

这是错误的类型。

在std :: string上插入(不是在末尾)的复杂度为O(n)。

您想要一个具有平均复杂度的结构来插入/删除/修改O(1)。

即。插入成本不应与数据大小有关。

答案 5 :(得分:0)

考虑到内存带宽以GB / s为单位

http://en.wikipedia.org/wiki/DDR3_SDRAM

你估计复制256k需要多长时间?

答案 6 :(得分:0)

我认真考虑将文本存储为单个大字符串,而不是单独的行。 std::list<std::string>std::vector<std::string>似乎是合适的。这样的认可将有效地将您的大字符串分布在多个较小的字符串上,并且修改后的重新分配将仅发生在单独的行或本身的行数组中。您必须选择的唯一权衡是在std :: vector和std :: list之间,尽管我倾向于选择std :: list。

逐行方法的另一个优点是,在阅读文件时,您可以轻松地逐行阅读std::getline,而不必自己关心读取缓冲区。