在我的应用程序中,我有一个字符串 vector 。在这个 vector 中,我有各种字符串,并且想从我的 vector 字符串中删除只包含字母的字符串。我写了这样的东西:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
bool lettersOnly(std::string text)
{
for(int i=0; i<text.length(); i++)
{
if(!isalpha(text.at(i)))
return false;
}
return true;
}
void removeWordsWithLettersOnly(std::vector<std::string> &vec)
{
for(int i=0; i<vec.size(); i++)
{
std::string text = vec.at(i);
if(lettersOnly(text))
vec.erase(remove(vec.begin(), vec.end(), text), vec.end());
}
}
int main()
{
vector<string> vec;
vec.push_back("Someletters");
vec.push_back("Bomeletters");
vec.push_back("someletters");
vec.push_back("123456543");
vec.push_back("098765");
vec.push_back("someletters");
vec.push_back("someletters");
vec.push_back("someletters234567");
for(int i=0; i<vec.size(); i++)
cout << vec[i] << "\n";
cout << "\n\n\n";
removeWordsWithLettersOnly(vec);
for(int i=0; i<vec.size(); i++)
cout << vec[i] << "\n";
return 0;
}
问题是,无论我在 vector 上使用我的方法,它都不会删除它应该删除的每个字符串。对于我上面的示例代码,它不会删除字符串 Bomeletters
。这是为什么?这个字符串只有字母,所以应该被删除。有什么想法吗?
您的循环移除了您脚下的元素,使事情变得复杂。
您可以像这样简单地将 std::remove_if
与您的谓词一起使用:
void removeWordsWithLettersOnly(std::vector<std::string> &vec)
{
vec.erase(remove_if(vec.begin(), vec.end(), lettersOnly), vec.end());
}
有了它,您的代码就会按预期工作。
请注意,您的 lettersOnly
谓词正在为传递给它的每个字符串制作不必要的拷贝。您可以通过将其参数改为 const
引用来解决此问题:
bool lettersOnly(const std::string& text) { /* as before */ }
我是一名优秀的程序员,十分优秀!