【发布时间】:2013-07-10 03:22:35
【问题描述】:
我正在写一个函数,它接受三个参数:
-
target:目标字符串 -
oldVal:旧子字符串 -
newVal: 新的子字符串(替换 oldVal)
这个函数的任务是找出所有oldVal在target字符串中出现的地方,并将它们替换为newVal。
这是我目前拥有的功能:
std::string replace_old_with_new(std::string target, std::string oldVal, std::string newVal) {
std::cout << "target : " << target << ", oldVal: " << oldVal << ", newVal: " << newVal << "\n";
std::string::iterator begin = target.begin();
std::string::iterator oldValBegin = oldVal.begin();
while (begin != target.end()) {
if (*begin == *oldValBegin) {
target = target.replace(begin, begin + oldVal.size(), oldVal);
begin = target.begin();
} else {
++begin;
}
}
return target;
}
对上述函数的如下调用:
replace_old_with_new("Hello! hi hi!", "hi", "bye");
应该返回字符串 -
"Hello! bye bye!"
但是,当我运行代码时,什么也没有发生。好像我陷入了无限循环。光标在终端上一直闪烁。我的功能有问题。我认为可能令人不安的是if 块中的replace 调用。这是在replace 函数调用中使用迭代器范围的正确方法吗?我可以用erase 和insert 做到这一点。但我想在这里使用replace。
【问题讨论】:
-
当您进行就地更换时,需要进行一些棘手的簿记来跟踪您的位置。如果替换文本比被替换的文本短,你可以很容易地做到这一点,但如果替换文本比被替换的文本长,你必须将字符串的尾部移出足够远以便为新文本留出空间;如果你反复这样做,你最终会做很多复制,这会很慢。
-
Pete Becker 解决方案的一个版本可以在我的帖子中找到:-> stackoverflow.com/questions/20406744
标签: c++ string c++11 iterator replace