Unc*_*ens 34
可能最简单的方法是使用boost字符串算法库.
boost::replace_all(myString, "/", "\\/");
std::string result = boost::replace_all_copy(myString, "/", "\\/");
Run Code Online (Sandbox Code Playgroud)
答案是否定的......如果您的意思是标准库已经提供了单行,那么就没有"简单"的方法.然而,实现该功能并不困难.
首先,我认为可能还需要更换\与\\和其他特殊字符.在这种情况下,使用replaceAllildjarn给出的实现会很烦人(你需要多次替换相同的字符串).
在我看来,有许多字符串处理的情况,其中没有什么比使用显式char *方法更好.在这个特定的情况下,可能只是使用索引是好的:
std::string escape(const std::string& s)
{
int n = s.size(), wp = 0;
std::vector<char> result(n*2);
for (int i=0; i<n; i++)
{
if (s[i] == '/' || s[i] == '\\')
result[wp++] = '\\';
result[wp++] = s[i];
}
return std::string(&result[0], &result[wp]);
}
Run Code Online (Sandbox Code Playgroud)
基本上,这个想法是搬过来的字符串,并增加一个额外的\任何特殊字符前字符(在上面我只是处理/和\,但你的想法).结果已知2*n长度最大,因此我预先分配它使整个处理O(n)(该replaceAll方法继续将字符串的其余部分向右移动,使其为O(n ^ 2)).即使像"this is a test with /slashes/ that should be /escaped/"上面这样的短字符串功能在我的电脑上也更有效率(1.3倍的速度),即使replaceAll只调用一次并处理两个特殊的字符escape.
还要注意,这个函数自然地返回一个单独的字符串而不是修改字符串(IMO是一个更好的接口),并且在时序比较中我必须为每个调用创建一个字符串,所以结果甚至转向相等,因为增加了常量时间.
上述读/写方法也可以很容易地扩展到更复杂的替换(例如>,>用%xx编码替换或不在可打印范围内的字符)仍然保持大字符串的良好效率(仅一次通过).
| 归档时间: |
|
| 查看次数: |
26553 次 |
| 最近记录: |