如何从仅使用字母的矢量字符串中删除?我的代码不会删除我需要删除的每个字符串

How to remove from vector string with letters only? My code does not remove every string I need to delete

本文关键字:删除 字符串 代码 我的      更新时间:2023-10-16

在我的应用程序中,我有一个字符串向量。在这个向量中,我有各种字符串,并希望从仅包含字母的向量字符串中删除。我写了这样的东西:

#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 << "nnn";
    removeWordsWithLettersOnly(vec);
    for(int i=0; i<vec.size(); i++)
        cout << vec[i] << "n";
    return 0;
}

问题是,无论我在向量上使用我的方法,它都不会删除它应该删除的每个字符串。对于我上面的示例代码,它不会删除字符串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 */ }

迭代向量时要从向量中删除。

例如:当"Someletters"被删除时>你的向量的大小会减小,现在"Bomeletters"处于位置0。 但是您的计数器 i 已经在位置 1 -> 所以错过了"Bomeletters"。

解决此问题的最简单方法是将未过滤的字符串复制到新向量,然后使用 "swap()" 替换 2 个向量的内容。