如何擦除矢量元素中没有特定字符的元素
how to erase an element hasn't a certain character in vector elements
>我找到了很多擦除向量元素具有特定字符的答案 但是我试图制作其中一些解决方案来擦除没有该字符但不起作用的元素
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 及更新版本(中,这是很常见的事情,因此值得习惯和使用它。
- 如何在C++中确定文本文件中的元素是字符还是数字
- 对字符数组中的元素执行逐位操作
- 从字符数组的元素中减去'a'是什么意思
- 常量数组如何在每个元素中只能包含字符,而 char* 数组能够指向每个元素中的字符串?
- 为什么在 c++ 中分配 char 数组元素时,分配的字符会被销毁?
- 有没有办法搜索向量的元素,<String>然后检查它是否包含特定的字符,如果它确实打印了它
- 如何擦除矢量元素中没有特定字符的元素
- C++ 无法更改字符数组中的元素
- 为什么这段代码给出错误......'a'是指针到字符指针,应该存储's'的地址,因为s是指向数组的第一个元素的指针
- 如何将 int 数组的 1 个元素转换为字符串/字符
- 如何在 2D 字符数组中打印 [x][y] 元素的地址?(C++)
- 在字符串的每个元素(不使用弦乐)的每个元素之后插入字符
- C++ 使用 find_first_not_of(字符*)删除矢量元素
- 在 c++ 中使用未知元素初始化的字符数组
- 删除具有某些字符要求的字符串向量的元素
- 如何获取数组中字符串元素的字符数?[C++]
- 将字符值分配给向量元素.C
- 字符指针对象和相应的字符数组元素比较
- 从 1 中创建新的字符 * 作为参数,元素位于 2 个索引之间
- 如何使用用户输入正确修改 2D 数组中的字符数组元素?专门用于电影院座位