C++:寻找一种简洁的解决方案,用特定字符替换 std::string 中的一组字符
Posted
技术标签:
【中文标题】C++:寻找一种简洁的解决方案,用特定字符替换 std::string 中的一组字符【英文标题】:C++: Looking for a concise solution to replace a set of characters in a std::string with a specific character 【发布时间】:2009-08-12 23:58:23 【问题描述】:假设我有以下:
std::string some_string = "2009-06-27 17:44:59.027";
问题是:给出将 some_string 中所有“-”和“:”实例替换为空格的代码,即“”
我正在寻找一个简单的单班轮(如果可能的话)
可以使用Boost。
【问题讨论】:
【参考方案1】:replace_if( some_string.begin(), some_string.end(), boost::bind( ispunct<char>, _1, locale() ), ' ' );
一行而不是 n^2 运行时间或调用正则表达式引擎 ;v) ,虽然你需要为此提升有点难过。
【讨论】:
请注意,这将替换所有标点符号,而不仅仅是“:”和“-”。ispunct<char>
应替换为执行指定操作的函数。
替换( some_string.begin(), some_string.end(), ':', ' ' );替换( some_string.begin(), some_string.end(), '-', ' ' );
+1 表示关于 n^2 运行时间和/或使用正则表达式引擎获取其他答案的注释。我知道考虑性能是过时的,但如果一个人不关心性能,他们为什么要操心 C++?【参考方案2】:
Boost 有一个似乎不为人知的字符串算法库:
String Algorithm Quick Reference
有一个基于正则表达式的替换版本,类似于帖子 1,但我发现find_format_all
的性能更好。这是一个单行启动:
find_format_all(some_string,token_finder(is_any_of("-:")),const_formatter(" "));
【讨论】:
【参考方案3】:您可以使用 Boost 正则表达式来做到这一点。像这样的:
e = boost::regex("[-:]");
some_string = regex_replace(some_string, e, " ");
【讨论】:
【参考方案4】:我会这样写:
for (string::iterator p = some_string.begin(); p != some_string.end(); ++p)
if ((*p == '-') || (*p == ':'))
*p = ' ';
不是一个简洁的单行代码,但我很确定它第一次就可以正常工作,没有人会在理解它时遇到任何困难,并且编译器可能会生成接近最佳的目标代码。
【讨论】:
【参考方案5】:来自http://www.cppreference.com/wiki/string/find_first_of
string some_string = "2009-06-27 17:44:59.027";
size_type found = 0;
while ((found = str.find_first_of("-:", found)) != string::npos)
some_string[found] = ' ';
【讨论】:
【参考方案6】:replace_if(str.begin(), str.end(), [&](char c) -> bool
if (c == '-' || c == '.')
return true;
else
return false;
, ' ');
这是使用 c++ox 的 1 班轮。如果不使用仿函数。
replace_if(str.begin(), str.end(), CanReplace, ' ');
typedef string::iterator 迭代器;
bool CanReplace(char t) if (t == '.' || t == '-') 返回真; 别的 返回假;
【讨论】:
以上是关于C++:寻找一种简洁的解决方案,用特定字符替换 std::string 中的一组字符的主要内容,如果未能解决你的问题,请参考以下文章