2015-02-08 3 views
0

Я ищу заменить все алгоритм, который заменил все вхождения подстроки после определенного положения. Пока у меня есть подход 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

Если вы хотите выполнить операцию поиска и замены на месте, вы должны знать о последствиях производительности. Чтобы выполнить такую ​​операцию, вам, скорее всего, придется прочитать строку назад, что может привести к поведению плохого кэша или сделать много перетасовки памяти, что также может быть плохой для производительности. В общем, лучше всего выполнить операцию замены в копии, так как любые строки, которые вы будете работать, скорее всего будут относительно небольшими, и большинство кэшей памяти будут обрабатывать вещи довольно легко.

Если у вас должен быть алгоритм поиска и замены на месте, используйте следующий код, если вы просто ищете функцию всплытия. Я сравнивал это, и это очень быстро.

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; 
} 
Смежные вопросы