Заменить все вхождения строки поиска после определенной позиции

я ищу заменить все алгоритм, который заменил все вхождения подстроки после определенной позиции. Пока у меня есть replace all copy подход. Какой самый удобный способ сделать это без выделения новой строки, кроме этот? Существует ли удобный способ сделать это с 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;
}
0

Другие решения


По вопросам рекламы [email protected]