Я спрашивал об этом то же самое в http://hardforum.com/showthread.php?t=979477 года назад.
Я не очень хорошо помню это, но следующий код был в комментарии # 31 и я думаю, что это было быстрее, чем мои другие попытки (но не быстрее, чем пример metered_string MikeBlas):
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <sstream>
using namespace std;
inline string replaceAll(const string& s, const string& f, const string& r) {
if (s.empty() || f.empty() || f == r || f.size() > s.size() || s.find(f) == string::npos) {
return s;
}
ostringstream build_it;
typedef string::const_iterator iter;
iter i(s.begin());
const iter::difference_type f_size(distance(f.begin(), f.end()));
for (iter pos; (pos = search(i , s.end(), f.begin(), f.end())) != s.end(); ) {
copy(i, pos, ostreambuf_iterator<char>(build_it));
copy(r.begin(), r.end(), ostreambuf_iterator<char>(build_it));
advance(pos, f_size);
i = pos;
}
copy(i, s.end(), ostreambuf_iterator<char>(build_it));
return build_it.str();
}
int main() {
const string source(20971520, 'a');
const string test(replaceAll(source, "a", "4"));
}
См. ветку для большего количества примеров и множества обсуждений.
Если я помнюправильно, было действительно легко сделать вещи быстрее, чем boost_all_all.
Вот более понятная версия c ++ 0x:
#include <string>
#include <algorithm>
#include <iterator>
#include <sstream>
#include <ostream>
using namespace std;
string replace_all_copy(const string& s, const string& f, const string& r) {
if (s.empty() || f.empty() || f == r || f.size() > s.size()) {
return s;
}
ostringstream buffer;
auto start = s.cbegin();
while (true) {
const auto end = search(start , s.cend(), f.cbegin(), f.cend());
copy(start, end, ostreambuf_iterator<char>(buffer));
if (end == s.cend()) {
break;
}
copy(r.cbegin(), r.cend(), ostreambuf_iterator<char>(buffer));
start = end + f.size();
}
return buffer.str();
}
int main() {
const string s(20971520, 'a');
const string result = replace_all_copy(s, "a", "4");
}
// g++ -Wall -Wextra replace_all_copy.cc -o replace_all_copy -O3 -s -std=c++0x