【发布时间】:2011-12-05 03:47:44
【问题描述】:
我正在寻找最有效(就“最快”而言)的方法来用另一个字符串替换字符串中所有出现的子字符串。到目前为止,我想出的只是:
std::string StringReplaceAll(const std::string &cstSearch, const std::string &cstReplace, const std::string &cstSubject)
{
if(cstSearch.length() > cstSubject.length() || cstSearch == cstReplace || cstSubject.empty() || cstSearch.empty() || cstSubject.find(cstSearch) == std::string::npos)
{
return cstSubject;
}
std::ostringstream ossReturn;
std::string::const_iterator ci(cstSubject.cbegin());
const std::string::const_iterator::difference_type ciFindSize(std::distance(cstSearch.cbegin(), cstSearch.cend()));
for(std::string::const_iterator ciNow; (ciNow = std::search(ci, cstSubject.cend(), cstSearch.cbegin(), cstSearch.cend())) != cstSubject.cend(); ci = ciNow)
{
std::copy(ci, ciNow, std::ostreambuf_iterator<char> (ossReturn));
std::copy(cstReplace.cbegin(), cstReplace.cend(), std::ostreambuf_iterator<char> (ossReturn));
std::advance(ciNow, ciFindSize);
}
std::copy(ci, cstSubject.cend(), std::ostreambuf_iterator<char> (ossReturn));
return ossReturn.str();
}
...这对我的需求来说太慢了(!!!):-(
期待向你们学习!
【问题讨论】:
-
相同的算法,但附加到字符串而不是使用字符串流会更有效。
-
什么是“您的需求”,是什么决定了它们?我们在这里谈论什么样的字符串长度?字符串从哪里来?优化需要针对特定条件进行优化。
-
谢谢!使用 std::string 而不是 std::ostringstream 确实更有效!现在也将研究 Boost 库!
标签: c++ string performance stl str-replace