Возможно, я упускаю из виду нечто очевидное, но мне было интересно, каким может быть самый быстрый способ реализации замены целых слов в C ++.Сначала я рассматривал просто объединение пробелов в поисковом слове, но это не учитывает границы строк или знаки препинания.
Это моя текущая абстракция для замены (не целого слова):
void Replace(wstring& input, wstring find, wstring replace_with) {
if (find.empty() || find == replace_with || input.length() < find.length()) {
return;
}
for (size_t pos = input.find(find);
pos != wstring::npos;
pos = input.find(find, pos)) {
input.replace(pos, find.length(), replace_with);
pos += replace_with.length();
}
}
Если бы я рассматривал только пробелы как границу слова, я, вероятно, мог бы реализовать это, сравнив начало и конец строки поиска со строкой поиска, чтобы покрыть границы строки, а затем добавив Заменить (L ').'+ find + L' ') .... но мне было интересно, есть ли более элегантное решение, которое бы эффективно включало пунктуацию.
Давайте рассмотрим слово как любую коллекцию символов, котораяразделенные пробелами или знаками препинания (скажем так: "# $% & '() * +, -. / как минимум, что соответствует (c > 31 && c < 48)
).
В моемПриложение Я должен вызывать эту функцию для довольно большого массива коротких строк, которые могут включать в себя различные Unicode, которые я не хочу разделять новые слова.Я хотел бы избежать включения каких-либо внешних библиотек, но с STL все в порядке.
Цель не использовать регулярные выражения - это обещание меньших накладных расходов и цель быстрой функции, подходящей для этой конкретной задачи, в большом наборе данных.