C++ 在stl中删除字符串中的关键字?

C++ 在stl中删除字符串中的关键字?,c++,string,stl,erase,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'

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

#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;
}
#包括
使用名称空间std;
int main(){
无序集合a={'a'、'e'、'i'、'o'、'o'、'u'、'u'、'a'、'e'、'i'、''};
string s=“你在做什么”;
字符串::迭代器;
for(it=s.begin();it!=s.end();it++){
如果(a.find(*it)=a.end()){
s、 擦掉(它);}
}   

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

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::remove_if()

注2:最好不要包含“bits/stdc++.h”


删除符号时,代码出现问题

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::remove_if()

注2:最好不要包含“bits/stdc++.h”


在循环时更改字符串,这不起作用,因为您使迭代器无效。@πάνταῥεῖ 实际上,
std::string::erase
doc并没有说它会使迭代器无效hmmRecommendation:include
()和
使用命名空间std;
()。使用这两种方法时要更加小心,因为它们会放大彼此的一些最坏影响。为什么要进行向下投票和关闭请求?OP在IMHO中创建并提供了足够的信息。您在循环时更改字符串,但这不起作用,因为您使迭代器无效。@πάνταῥεῖ 实际上,
std::string::erase
doc并没有说它会使迭代器无效hmmRecommendation:include()和
使用命名空间std;
()。使用这两种方法时要更加小心,因为它们会放大彼此的一些最坏影响。为什么要进行向下投票和关闭请求?OP创建并提供了足够的信息IMHO。在CPPFREFERENCE中一定是失败的,例如,
end()
迭代器肯定是无效的….@user463035818是的,仍然不清楚它是否是无效的。看起来应该再问一个问题。删除/擦除习惯用法具有线性最坏情况复杂性。对于另一种方法,它是二次的。因此,使用它和讨论迭代器是否无效是不明智的s有点无意义。请注意,字符串的结尾会发生变化。由于字符串是连续的,前迭代器的副本会超出范围的结尾,显然是无效的。必须是cppreference中的失败,例如
end()
迭代器肯定是无效的….@user463035818是的,仍然不清楚它是否是无效的。看起来应该再问一个问题。删除/擦除习惯用法具有线性最坏情况复杂性。对于另一种方法,它是二次的。因此,使用它和讨论迭代器是否无效是不明智的注意,字符串的结尾会发生变化。因为字符串是连续的,所以前迭代器的副本会超出范围的结尾,显然是无效的。