如何从仅使用字母的矢量字符串中删除?我的代码不会删除我需要删除的每个字符串
How to remove from vector string with letters only? My code does not remove every string I need to delete
在我的应用程序中,我有一个字符串向量。在这个向量中,我有各种字符串,并希望从仅包含字母的向量字符串中删除。我写了这样的东西:
#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 个向量的内容。
相关文章:
- 如何删除字符串中的前 2 个字符(如果它有"-")
- 删除字符串后C++检测到堆损坏
- 如何在 c++ 中删除字符串中的某些字符?
- 删除字符串数组
- 删除字符串中具有相同值的任何相邻字母"pair"
- 删除字符串向量中的字符重复
- 如何在Qt中删除字符串(qstring)中的子字符串
- 删除字符串指针在struct中的内存
- 删除 C 字符串中的大写字母
- 如何搜索和删除字符串中的字符
- 如何删除字符串中的所有空格并将数据存储在两者之间
- 删除字符串中不平衡的括号
- 删除字符串数组中的换行符
- 如何修复我的代码以删除字符串中的空格
- 如何删除字符串所有可能的子字符串中带有空格的子字符串?
- 如何创建删除 C 字符串中所有选定字符的函数
- 传递GTK回调时,请在C 中删除字符串向量
- 为什么删除字符串迭代器会产生const char参考
- 从<string>向量<int>中定义的索引处的向量中删除字符串
- 如何使用 c++ 剪切或删除字符串中的某些字符