问题标签 [erase-remove-idiom]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
86 浏览

c++ - remove_if 删除向量中的所有内容

我正在为一项任务编写一个程序——它应该是一个关于公司员工信息的数据库。基本上,一个包含结构(个体雇员)的向量。

我遇到的麻烦是remove_if会删除向量中的所有内容 - 而不是单个员工。

如果我正确理解文档/其他主题,该函数应该做两件事 - 重新排列向量的元素,并将迭代器返回到新范围之外的第一个元素 - 但它没有这样做,它返回一个迭代器到第一个element - 所以当 调用erase()函数时,所有元素都会被删除。至少这是我在调试时发现的。

这是我的代码的 mcve:

我意识到我可以在一个循环中做同样的事情——事实上,我做到了,但我无法理解为什么这种方法不起作用。此外,对于这个程序来说,一个列表可能是一个更好的选择(有了它,for 循环会花费更少的指令来计算),但我已经完成了这个程序,现在我真的很想知道为什么没有 remove_if 工作。

谢谢!

编辑:正如@drescherjm 指出的那样,这是因为当不满足if语句时lambda 函数没有返回false 。

所以这个问题得到了回答。

0 投票
1 回答
165 浏览

c++ - 使用 remove_if 时元素会发生什么?

我试图了解如何remove_if工作(<<重载),为此我想 remove_if 所有以“C”开头的字符串:

输出Initial vector: Python C++ C Java C# | Size = 5

然后我写:

输出 2After remove_if: Python Java C C# | Size = 5

我的理解:应该保留的元素被删除到开头,*it现在等于"C"

问题:会发生什么"C++"?如果"Java"换了,为什么

给出输出 3C C#而不是"C", "Java", "C#"

0 投票
1 回答
772 浏览

c++ - 为什么擦除删除习语不适用于反向迭代器

我的目标是尝试解决这个问题:Removing all empty elements in a vector from end。使用擦除删除成语。

std::vector<std::string>这个想法是从给定的字符串中删除从末尾开始的所有空元素(等于空白) 。当找到非空元素时,应停止删除元素。

例子:

拆除后:

这是我尝试的解决方案:

这给了我一个错误:

然后我读到std::vector::erase()这里的工作:Does vector::erase not work with reverse iterators?

并更改了代码:

这次它编译了,但给了我输出=原始向量。

任何人都可以解释:

  1. 为什么会这样?
  2. 如果可能,我们该如何解决?
0 投票
1 回答
688 浏览

c++ - 从 C++ 中的字符数组中删除字符

我正在尝试创建一种从字符串中删除子字符串的方法。它是 char 形式的,所以我不能使用方便的方法来为字符串高兴地提供。我知道如何搜索它,我可以找到索引,但删除 char 对我来说有点冒险。如果有人有任何想法,我将不胜感激。谢谢。

我不能使用 Replace 方法,因为它是字符。char我已经尝试过嵌套循环,但由于and的不兼容而被卡住了int。如果有人有建议,我会全力以赴。再次感谢 Stack 社区。

0 投票
1 回答
62 浏览

c++ - 链表的通用函数 remove() 与成员函数 remove()

我正在阅读 Nicolai M.Josuttis 所写的“The C++ STL. A Tutorial and References”一书,在专门讨论 STL 算法的其中一章中,作者陈述了以下内容: 如果您为列表的元素调用 remove(),则算法不知道它正在对列表进行操作,因此会执行它对任何容器所做的操作:通过更改元素的值来重新排序元素。例如,如果算法删除了第一个元素,则所有后续元素都将分配给它们之前的元素。这种行为与列表的主要优点相矛盾:通过修改链接而不是值来插入、移动和删除元素的能力。为避免性能不佳,列表为所有操作算法提供了特殊的成员函数。你应该总是喜欢它们。此外,这些成员函数确实删除了“已删除”的元素,如下例所示:

当然,这似乎足以令人信服以供进一步考虑,但无论如何,我决定在我的 PC 上看到运行类似代码的结果,特别是在 MSVC 2013 环境中。这是我的即兴代码:

当看到以下输出时,我很惊讶:

您能否解释一下这种矛盾行为的原因是什么?

0 投票
4 回答
153 浏览

c++ - 有没有办法将擦除删除习语与其他循环条件一起使用?

我有一个函数,给定一个文本块,应该删除所有标点符号,并使所有字母小写,并最终根据单字母密码转换它们。下面的代码有效:

问题是,它目前对字符串进行了两次传递,一次删除标点符号,一次执行所有其他操作。这似乎效率低下,因为似乎所有转换都可以通过字符串以某种方式完成。是否有一种干净的方法可以将擦除删除习语与其他循环条件结合起来?

0 投票
3 回答
244 浏览

c++ - 带有擦除元素的 C++ 嵌套 for 循环

我想检查一个向量的所有元素。通过检查条件,应该删除一个元素。

一种方法是通过嵌套的 for 循环擦除元素

但这会在运行时影响向量及其大小。

第二种方法是在 unordered_set 中收集 b 的索引,但是如何删除原始向量中具有对应索引的元素?

如您所料,这种方法也不起作用:

有什么帮助吗?

0 投票
3 回答
179 浏览

c++ - 如何使用擦除删除习语从结构向量中擦除值?

如何擦除结构向量中的所有值,其中结构值k等于0?

我试过

0 投票
1 回答
125 浏览

c++ - 如何调整擦除删除习惯用法以使用向量元组?

我有一个包含成员 j、k 和 l 的元组向量。我正在尝试调整擦除删除习语,以便如果 .k 成员的值满足特定条件,我可以删除整个元组。

我尝试使用谓词引用元组成员位置的标准 .erase(removeif()) 方法,但被告知所讨论的向量类没有成员“k”。

我希望如果 vec_list_iter_exp_out 包含以下假设值:

整个 vec_list_iter_exp_out[2] 和 vec_list_iter_exp_out [4] 将被删除,然后 vec_list_iter_exp_out 将包含以下内容:

相反,我得到了上述编译错误。

任何帮助将不胜感激!

编辑:根据要求定义有问题的向量。

和插入片段(显然引用了其他函数和你有什么,但这会占用太多空间)

0 投票
1 回答
485 浏览

c++ - 对于erase-remove 习惯用法,为什么需要第二个参数指向容器的末尾?

考虑以下代码(取自cppreference.com,稍作修改):

为什么第二个参数是erase必要的?(即str1.end()在这种情况下。)

为什么我不能只提供 to 返回的迭代removeerase?为什么我还必须告诉它要擦除的容器的最后一个元素?

这里的陷阱是你也可以在erase没有第二个参数的情况下调用,但这显然会产生错误的结果。

是否存在我不想将容器的末尾作为第二个参数传递给的用例erase

省略erase擦除删除习语的第二个参数总是一个错误,或者这可能是一个有效的事情吗?