Estoy buscando la manera más eficiente (en términos de "más rápido") para reemplazar todas las apariciones de una subcadena dentro de una cadena con otra cadena. Todo lo que ocurrió con el hasta ahora es:En C++, ¿cuál es la manera más rápida de reemplazar todas las ocurrencias de una subcadena dentro de una cadena con otra cadena?
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();
}
... y ésta es la forma (!!!) demasiado lento para mis necesidades :-(
Mirando hacia adelante a aprender de ustedes !
mismo algoritmo, pero añadiendo a una cadena en lugar de utilizar stringstream será mucho más eficiente. –
http://www.boost.org/doc/libs/1_47_0/doc/html/string_algo/usage.html#id2896011 – sehe
¿Cuáles son "sus necesidades" y qué las dicta? ¿De qué tipos de cuerdas estamos hablando aquí? ¿De dónde vienen las cuerdas? La optimización requiere condiciones específicas para optimizar. –