我正在寻找替换所有算法,该算法在特定位置后替换了所有出现的子串。到目前为止,我有replace all copy
方法。除了this one之外,在没有分配新字符串的情况下,最方便的方法是什么?用boost来存在方便的方法吗?
#include <iostream>
#include <string>
#include <boost/algorithm/string/replace.hpp>
int main() {
std::string str = "1234 abc1234 marker 1234 1234 123 1 12 134 12341234";
const std::string marker("marker");
size_t pos = str.find(marker);
if (pos == std::string::npos) {
return 0;
}
pos += marker.length();
std::string str_out(str, 0, pos);
boost::algorithm::replace_all_copy(std::back_inserter(str_out), str.substr(pos, std::string::npos), "12", "XXXX");
std::cout << str << std::endl;
std::cout << str_out << std::endl;
}
答案 0 :(得分:0)
如果要进行就地查找和替换操作,则必须了解性能影响。为了执行此类操作,您可能必须向后读取字符串,这可能导致错误的缓存行为,或者执行大量内存重排,这对性能也有害。一般来说,最好进行复制替换操作,因为你要操作的任何字符串都可能相对较小,并且大多数内存缓存都会很容易处理。
如果您必须具有就地查找和替换算法,请使用以下代码,如果您只是在寻找插入功能。我对它进行了基准测试,速度非常快。
std::string& find_replace_in_place( std::string &haystack, const std::string needle, const std::string replacement, size_t start = 0 ){
size_t ret = 0;
size_t position = haystack.find( needle, start );
while( position != std::string::npos ){
haystack.replace( position, needle.length(), replacement );
position = haystack.find( needle, position + replacement.length() );
}
return haystack;
}