如何擦除矢量元素中没有特定字符的元素

how to erase an element hasn't a certain character in vector elements

本文关键字:元素 字符 何擦除 擦除      更新时间:2023-10-16

>我找到了很多擦除向量元素具有特定字符的答案 但是我试图制作其中一些解决方案来擦除没有该字符但不起作用的元素

for(int k=0; k<temp.size();k++)
{
while(temp[k].find_first_of("xX")!= string::npos)
{
temp.erase(temp.begin()+k);
}
}
variables_print.push_back(temp);

这里有一个例子,这些代码擦除了元素有字符"xX",但我试图让它成为temp[K].find_first_not_of("xX"(并且不起作用

也让它temp[K].find_first_of("xX"(== 字符串::npos并且不起作用

如何擦除没有 X 或 X 字符的元素

你可以这样做:

auto newEnd = std::remove_if(v.begin(), v.end(),
[](const auto& s) { return s.find_first_of("xX") == std::string::npos; });
v.erase(newEnd, v.end());

remove_if将所有不符合条件的元素移到前面,替换满足条件的元素。当作为第三个参数给出的 lambda 返回 true 时,满足此处的条件。newEnd是迭代器指向未删除元素之后的第一个元素。

例如,如果输入是这样的:{"aaa", "bbx", "ccc"},在调用remove_if后,向量看起来像这样:{"aaa", "ccc", <used to be bbx>}

第二行删除从newEnd开始的所有元素。所以在上面的例子中,你最终得到{"aaa", "ccc"}.

这里的条件是一个 lambda,它对不包含'x''X'的每个元素返回 true。

这与您尝试的条件相同 - 并且是正确的条件。原始代码的问题不同。

看:while(temp[k].find_first_of("xX")!= string::npos)。如果字符串不包含X,则不会执行此嵌套循环的主体,并且不会删除任何内容。此外,您可以将循环替换为简单的if语句。

外环还有另一个问题。每次都会递增k,即使您刚刚删除了一个元素。请考虑以下示例:{"x", "x"}。每次递增k时,您将跳过第二个字符串并最终得到{"x"}.

更正后的代码如下所示:

for(size_t k=0; k<v.size(); )
{
if(v[k].find_first_of("xX") == std::string::npos)
{
v.erase(v.begin()+k);
}
else
{
++k;
}
}

将其与第一个版本进行比较。它不仅更短,而且为错误留下的空间也少得多。

正如@Bob_在评论中指出的那样,第一个版本被称为擦除删除习语。在现代C++(即 C++11 及更新版本(中,这是很常见的事情,因此值得习惯和使用它。