替换由谓词确定的 std::string 中的字符的最 stl-ish 方法是什么



如果我有一个字符串abc12df34,我想用#替换数字并接收abc##df##

最糟糕的方法是什么?

据我说,这将是:

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;
}

假设至少C++11,我会说for_each带有对单个字符的迭代器发送对字符的引用的lambda函数。不确定它有多快,但是 STL 式的,我想它非常:)

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。我想这是比我更好的方法。但两者都有效:)

使用 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";
}

为什么不保持简单易读,而不是试图成为"stl-ish":

for (char& ch : str) {
  if (isdigit(ch)) ch = '#';
}

最新更新