我想使用std :: strings创建一个简单的文本编辑器。如果我的文本是500,000个字符,并且我想在第253,000个字符处插入或删除,这会很慢,还是会像我的文本包含10个字符一样快?否则,我不确定我要做些什么来解决它(除非我使用链接列表但是阅读速度很慢,这有点重新发明轮子。
由于
答案 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)
答案 6 :(得分:0)
我认真考虑将文本存储为单个大字符串,而不是单独的行。 std::list<std::string>
或std::vector<std::string>
似乎是合适的。这样的认可将有效地将您的大字符串分布在多个较小的字符串上,并且修改后的重新分配将仅发生在单独的行或本身的行数组中。您必须选择的唯一权衡是在std :: vector和std :: list之间,尽管我倾向于选择std :: list。
逐行方法的另一个优点是,在阅读文件时,您可以轻松地逐行阅读std::getline
,而不必自己关心读取缓冲区。