【发布时间】:2013-01-14 15:16:56
【问题描述】:
假设,大多数时候我有以下替换方案:
std::string line; // "line" contains a big string.
std::string from = "abcd";
std::string to = "xy"; // to.length() < from.length()
// replace "from" with "to" everywhere in "line"
这里string 类必须放置"xy",然后删除2 个字符,这有效地将line 中的所有字符向左移动。在我的代码的整个生命周期中发生了很多这样的替换。
现在进入真正的问题。我也可以接受以下内容:
// ...
if(to.legnth() < from.length())
to.resize(from.length(), ' ');
// now to.length() = from.length()
// replace "from" with "to" everywhere in "line"
仅当replace() 针对相同长度的字符串进行了优化时,上述练习才有帮助。应该是因为那是微不足道的;但只是想确认某人是否具有第一手知识。
我尝试通过 Eclipse IDE 浏览到字符串类,但无法深入研究。
【问题讨论】:
-
如果它不依赖于实现,我会感到非常惊讶(不会是第一次)。
-
@LightnessRacesinOrbit,您在将其标记为关闭之前没有阅读标题吗?
-
对我来说似乎是一个合理的问题。当目标(要替换)和替换字符串长度相同时,函数
std::string::replace()是否优化? -
21.4.6.6,p11 的快速浏览似乎没有提到任何关于相同长度的限制或优化,所以我将进行第一次评估;依赖于实现。
-
另外,我有点希望在
to不大于from的情况下,replace的行为类似于remove_if,因为它在单个线性传递中写入, 写入位置始终位于读取位置或读取位置之后。如果是这样,那么与“较小”的情况相比,“等大小”的情况几乎没有什么可优化的。
标签: c++ optimization replace stdstring