在 stl 的字符串中使用擦除关键字?
Working of erase keyword in string in stl?
我写这段代码是为了从字符串中删除辅音,但我的回答不正确。那么我应该对此代码进行哪些更改才能使其正常工作。此外,当我删除 space 字符,即无序集中的最后一个元素时,输出对我来说是意想不到的。所以请帮助我理解这段代码中发生了什么??
#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 成语 using 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"
不是一个好主意
我写这段代码是为了从字符串中删除辅音,但我的回答不正确。那么我应该对此代码进行哪些更改才能使其正常工作。此外,当我删除 space 字符,即无序集中的最后一个元素时,输出对我来说是意想不到的。所以请帮助我理解这段代码中发生了什么??
#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 成语 using 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"
不是一个好主意