如何在c ++字符串中删除所有出现的char

Dev*_*wal 88 c++ stl

我使用以下:

replace (str1.begin(), str1.end(), 'a' , '')
Run Code Online (Sandbox Code Playgroud)

但这会导致编译错误.

Ant*_*ine 152

基本上,replace将角色替换为另一个角色而''不是角色.你在寻找什么erase.

看到这个回答同样问题的问题.在你的情况下:

#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
Run Code Online (Sandbox Code Playgroud)

或者使用,boost如果这是你的选择,如:

#include <boost/algorithm/string.hpp>
boost::erase_all(str, "a");
Run Code Online (Sandbox Code Playgroud)

所有这些都在参考 网站上有详细记载.但是如果你不知道这些功能,你可以轻松地手工完成这类工作:

std::string output;
output.reserve(str.size()); // optional, avoids buffer reallocations in the loop
for(size_t i = 0; i < str.size(); ++i)
  if(str[i] != 'a') output += str[i];
Run Code Online (Sandbox Code Playgroud)

  • 我需要#include <algorithm> (4认同)
  • 您提供的算法不是***`O(n ^ 2)`***吗? (2认同)
  • @jww:我假设您在谈论最后一个代码示例,而 `n` 是原始字符串长度。对于每个输入字符,我执行 1 个字符测试 `O(1)`,并附加 0 或 1 个字符。字符追加是`O(1)` 是保留足够的内存,或者`O(current_length)` 如果分配了新缓冲区。如果你在循环之前做 `output.reserve(str.size())`,这永远不会发生,你有一个全局的 `O(n)` 成本。否则渐近地,我猜由于 STL 容器重新分配策略,成本是`O(n . log(n) )`。 (2认同)

Kai*_*zke 20

从 C++20 开始,std::erase()已添加到标准库中,它将对str.erase()和 的调用合并std::remove()到一个函数中:

std::erase(str, 'a');
Run Code Online (Sandbox Code Playgroud)

作用std::erase()于字符串的函数重载直接在<string>头文件中定义,因此不需要单独包含。为所有其他容器定义了类似的重载。


lee*_*mes 8

该算法对给定序列的每个元素std::replace起作用(因此它用不同的元素替换元素,并且不能用任何元素替换它).但是没有空洞的角色.如果要从序列中删除元素,则必须移动以下元素,并且不会像这样工作.std::replace

您可以尝试使用std::remove(与...一起std::erase)来实现此目的.

str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
Run Code Online (Sandbox Code Playgroud)


小智 6

string RemoveChar(string str, char c) 
{
   string result;
   for (size_t i = 0; i < str.size(); i++) 
   {
          char currentChar = str[i];
          if (currentChar != c)
              result += currentChar;
   }
       return result;
}
Run Code Online (Sandbox Code Playgroud)

我就是这样做的。

或者你可以像 Antoine 提到的那样做:

看到这个问题 ,它回答了同样的问题。在你的情况下:

#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
Run Code Online (Sandbox Code Playgroud)


per*_*eal 5

使用copy_if

#include <string>
#include <iostream>
#include <algorithm>
int main() {
    std::string s1 = "a1a2b3c4a5";
    char s2[256];
    std::copy_if(s1.begin(), s1.end(), s2, [](char c){return c!='a';});
    std::cout << s2 << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)