替换由谓词确定的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 &current) 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方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

用空格替换 std::string 中的特定字符

C++:寻找一种简洁的解决方案,用特定字符替换 std::string 中的一组字符

在 std::string 上执行正则表达式搜索和替换

iOS谓词匹配字符串以及替换

如何替换字符串中所有出现的字符?

如何替换向量图中的向量值?