从std :: string中删除空格的最佳方法

Jee*_*eet 4 c++ c++11 c++14

我已将文本文件内容加载到std :: string.我想从加载的字符串中删除空格.

  1. 需要使用以下哪种方法才能获得更好的性能?
  2. 以下哪种方法可以是最佳实践.
  3. 还有更好的方法来实现这一目标吗?

方法1:
在循环语句中使用string.find()扫描字符串,并使用string.erase()删除空格;

方法2:
使用循环语句中的string.find()扫描字符串,并使用string.append()将非空白字符复制到新的string()变量;

方法3:
使用循环语句中的string.find()扫描字符串,并使用string.replace()将非空白字符复制到新字符串(size_t n,char c)变量;

方法4:
分配char*(使用malloc [源字符串的大小])
在循环语句中使用string.find()扫描字符串,并使用strcpy将非空白字符复制到char*变量,然后使用strcat();
最后将char*复制到一个新的字符串
free char*

Que*_*tin 11

编辑:升级到区域设置感知特征.谢谢用户657267!

标准算法很整洁!

s.erase(std::remove_if(
    begin(s), end(s),
    [l = std::locale{}](auto ch) { return std::isspace(ch, l); }
), end(s));
Run Code Online (Sandbox Code Playgroud)

住在Coliru

那是为了就地修改,如果你需要保留原始字符串:

std::string s2;
s2.reserve(s.size());
std::remove_copy_if(
    begin(s), end(s),
    std::back_inserter(s2),
    [l = std::locale{}](auto ch) { return std::isspace(ch, l); }
);
Run Code Online (Sandbox Code Playgroud)

住在Coliru

  • @Quentin假设你是对的.使用单独分配的字符串,需要每个非空白字符的一个副本.正确编写remove_if,每个非空白字符只需要一次移动. (2认同)