在C中,用另一个字符串替换字符串中所有出现的子字符串的最快方法是什么?

我正在寻找最有效的(以“最快”的方式)来替换字符串中另外一个字符串的所有出现的子字符串.到目前为止我所想到的只有:

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来构建
结果; std :: ostringstream是用于格式化的,没有
格式化在这里完成.除此之外,你基本上是这样
正确的算法;使用std :: search来查找下一个
应该做更换.我会用一个while循环来做一些事情
更可读,它给出:

std::string
replaceAll( std::string const& original,
            std::string const& before,
            std::string const& after )
{
    std::string retval;
    std::string::const_iterator end     = original.end();
    std::string::const_iterator current = original.begin();
    std::string::const_iterator next    =
            std::search( current, end, before.begin(), before.end() );
    while ( next != end ) {
        retval.append( current, next );
        retval.append( after );
        current = next + before.size();
        next = std::search( current, end, before.begin(), before.end() );
    }
    retval.append( current, next );
    return retval;
}

(请注意,使用std :: string :: append将比使用更快
的std ::复印件;该字符串知道它必须添加多少,并可以调整大小
字符串相应.)

之后,抓住那里的特殊情况是微不足道的
没有任何替代,并立即返回初始字符串;那里
可能会使用std :: string :: reserve作为一些改进
好. (如果前后有相同的长度,
retval.reserve(original.size())是一个明显的胜利.即使没有,
这可能是一场胜利.至于首先计算替代次数,那么
准确计算最终的大小,我不知道.你必须
测量您的实际用例以了解.)

转载注明原文:在C中,用另一个字符串替换字符串中所有出现的子字符串的最快方法是什么? - 代码日志