替换由谓词确定的std :: string中的字符的最stl-ish方法是啥?
Posted
技术标签:
【中文标题】替换由谓词确定的std :: string中的字符的最stl-ish方法是啥?【英文标题】:What is the most stl-ish way to replace character in a std::string that are determined by predicate?替换由谓词确定的std :: string中的字符的最stl-ish方法是什么? 【发布时间】:2016-02-10 19:52:51 【问题描述】:如果我有一个字符串abc12df34
,我想用# 替换说数字并接收abc##df##
。
最时髦的方法是什么?
【问题讨论】:
你见过std::replace_if
吗?
是的,这样就可以了。也许它是如此明显,这就是为什么以前没有人问过它 - 但现在我使用堆栈溢出作为文档 - 在这种情况下我失败了。
QString & QString::replace(const QRegExp & rx, const QString & after)
doc.qt.io/qt-4.8/qstring.html
@user3528438 Qt 如何应用于这个问题(即它与 STL 有什么关系)?
@JamesAdkison 表明对这个问题最时髦的答案是改进std::string
至少与QString
一样全功能。
【参考方案1】:
在我看来,这将是:
http://ideone.com/bcd20z
int main()
std::string s = "abc12df34";
std::replace_if(s.begin(), s.end(), [](char c) return isdigit(c); , '#');
std::cout << s << std::endl;
return 0;
【讨论】:
【参考方案2】:至少假设 C++11,我会说 for_each 带有一个带有迭代器的 lambda 函数到单个 char 发送对 char 的引用。 不知道它有多快,但 STL-ish,我猜它相当多:)
using namespace std;
int main()
string text("abc12df34";
for_each(text.begin(), text.end(), [](char ¤t) if (current >= '0' && current <= '9') current = '#';);
.....
编辑:我刚刚阅读了以前的答案。我不知道is_digit,也没有考虑std::replace_if。我想这是比我更好的方法。但两者都有效:)
【讨论】:
【参考方案3】:使用 std::transform
将字符串和 lambda 转换为一元谓词。
#include <algorithm>
#include <string>
#include <iostream>
int main()
std::string s("abc12df34");
using std::begin;
using std::end;
std::transform(begin(s), end(s), begin(s), [&](char c)
return (c >= '0' && c <= '9') ? '#' : c;
);
std::cout << s << "\n";
【讨论】:
【参考方案4】:为什么不让它简单易读,而不是尝试“stl-ish”:
for (char& ch : str)
if (isdigit(ch)) ch = '#';
【讨论】:
以上是关于替换由谓词确定的std :: string中的字符的最stl-ish方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章