【发布时间】:2011-05-09 20:06:00
【问题描述】:
也许我忽略了一些显而易见的事情,但我想知道在 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();
}
}
如果我只将空格视为单词边界,我可以通过将搜索字符串的开头和结尾与查找字符串进行比较以覆盖字符串边界,然后使用 Replace(L' ' + find + L' ')....但我想知道是否有更优雅的解决方案可以有效地包含标点符号。
让我们认为一个单词是由空格或标点符号分隔的任何字符集合(为了简单起见,我们说!”#$%&'()*+,-./ 至少 - 这恰好发生在对应(c > 31 && c < 48))。
在我的应用程序中,我必须在相当大的短字符串数组上调用此函数,其中可能包括我不想拆分新单词的各种 Unicode。我也想避免包含任何外部库,但 STL 很好。
不使用正则表达式的目的是保证更少的开销,以及在大型数据集上适合此特定任务的快速函数的目标。
【问题讨论】:
-
旁注:如果输入很长并且您在开始时进行替换,替换可能会非常慢。我建议连接到一个字符串缓冲区(例如 std::stringstream),然后一步覆盖输入。
-
Unicode 要求会让事情变得更加棘手。我知道您正在尝试避免使用正则表达式并添加库,但您可以查看 ICU - 它具有基于正则表达式的替换功能 (regex docs),并且可以让您使用 \b“单词边界”元字符.
标签: c++ visual-c++ string