在特定位置后替换所有出现的搜索字符串

时间:2015-02-08 22:42:26

标签: c++ boost replaceall

我正在寻找替换所有算法,该算法在特定位置后替换了所有出现的子串。到目前为止,我有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;
}

1 个答案:

答案 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;
}