c++ - 在 STL 中使用字符串中的删除关键字?

标签 c++ string stl erase

我编写此代码是为了从字符串中删除辅音,但我的答案不正确。那么我应该对此代码进行哪些更改才能使其正常工作。此外,当我从无序集中删除空格字符即最后一个元素时,输出对我来说是意外的。所以请帮助我理解这段代码中发生了什么??

#include<bits/stdc++.h>
using namespace std;

int main() {
   unordered_set<char> a={'a','e','i','o','O','u','U','A','E','I',' '};

   string s="what are you doing";

   string ::iterator it;
   for(it=s.begin();it!=s.end();it++){
      if(a.find(*it)==a.end()){
         s.erase(it);}
    }   

    cout<<s;
    return 0;
}

最佳答案

当您删除符号时,您的代码有问题

s.erase(it);

然后通过循环增加它,你跳过一个符号,也可能越过字符串的末尾。修复代码的可能解决方案:

for(it=s.begin();it!=s.end();){
   if(a.find(*it)==a.end())
      it = s.erase(it);
   else
      ++it;
 }

注意 1:通常在 STL 容器中,当通过迭代器删除元素时会使该迭代器无效。虽然 std::string::erase() 的文档并没有说任何迭代器都失效了,这里可能不是这种情况。无论如何,我提供的代码在任何情况下都适用于任何容器,也能解决您的问题。

但最好使用 erase-remove使用 std::remove_if() 的成语:

   s.erase( std::remove_if( s.begin(), s.end(), [a] ( char c ){ return a.count(c) == 0; } ), s.end() );

注意2:包含“bits/stdc++.h”不是一个好主意

live example

关于c++ - 在 STL 中使用字符串中的删除关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51898830/

相关文章:

c# - C++/CLI 双指针类型转换为 ref IntPtr 以进行 C# 访问

c++ - 以编程方式调用 Snap/Aero 最大化

c++ - 我如何使用 NPAPI 从 JavaScript 调用 C++ 代码

java - 在Java中从输入文本文件中的字符串中分离单词并将其逐行打印到输出文本文件

c++ - c++中的 vector 下标超出范围错误

c++ - 无法理解为什么会发生段错误

php - 如何从以下日期格式的mysql中选择即将到来的日期?

python - 在 Python 中组合单词(排列?)

c++ - 使用流式从文件中读取一行

c++ - 如何初始化一个类数据成员,它是一个带有自定义比较器的 std::set