问题标签 [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 投票
2 回答
1536 浏览

c++ - vector.erase() 和 remove_if() 有问题

在使用 remove_if 之前,我使用的是 remove。所以说如果我有 vec = {1, 2, 2, 2, 5},并且想要删除所有 2,我会这样做:

这是行不通的,因为在删除过程中遍历向量是不可能且不合逻辑的。

于是我发现了remove_if()。但是,由于某种原因,我无法让它在类的上下文中工作。这是我的代码:

我猜 void delete 将不起作用,因为 a 是一个 int 并且我需要一个 bool 值,但不确定如何将“如果 int a 在此向量中返回 true”表示为 remove_if 的第三个参数。我希望 void delete_even 可以工作,但我得到了

0 投票
1 回答
54 浏览

c++ - C ++从单词的开头删除非字母字符

我在字符串类型的方法中有以下代码,它从文件中读取单词,从单词的开头删除所有非字母字符(如下所示)并在这样做之后返回它们。在 main 方法中打印出结果后,我注意到即使它应该从头开始删除所有非字母字符,它仍然总是打印出 1,例如:列表包含单词:

那里,——曾经是一只可爱的——;小兔子,他被枪杀了,故事结束

应用该函数后,输出为:

曾经有一只可爱的小兔子,他被枪杀了,故事结束

如果有人能告诉我到底是什么我没有看到,我将不胜感激。我已经尝试了所有不同的函数,例如Erase()、isalpha()等。它们在不应该产生相同的结果时都会产生相同的结果。我在做什么禁止删除最后一个非字母字符(在单词的开头)?我尝试了同样的方法来删除单词末尾的所有标点符号,但它会删除除一个之外的所有标点符号(再次)。

谢谢你的时间

0 投票
2 回答
150 浏览

c++ - 在擦除删除习语中使用 UnaryPredicate 的否定

考虑以下场景:

我可以使用相同的is_odd()UnaryPredicate 来删除最后一行中预期的偶数吗main()?或者我是否必须写一个is_even(),即使它只是:

0 投票
4 回答
432 浏览

c++ - 如何模拟 remove_unless

我有代码从 astd::vector<int>中删除所有小于 some的元素int limit。我编写了一些部分应用 lambda 的函数:

当我用 测试它时std::vector<int> v{1,2,3,4,5};,我得到了预期的结果:

我可以轻松删除所有少于三个的元素:

如何使用删除大于或等于 3 的元素less_than_three

我尝试换行less_than_threestd::not1但出现错误:

然后我尝试std::not1(std::ref(less_than_three))了,但得到了这些错误:

如何在std::remove_if不更改 lambda 逻辑的情况下否定函数?换句话说,我该如何模仿remove_unless

0 投票
1 回答
231 浏览

c++ - 是否可以将“erase-remove”习语扩展为一次在多个容器上工作?

在 C++ 中,erase-remove 习惯用法是删除标准容器中满足给定条件的所有元素的好方法。

是否可以将擦除删除习惯用法扩展为一次在多个容器上工作?

也就是说,可以erase-remove在一个容器上调用类似的东西,并同时删除另一个容器中的相应元素吗?

在我的特殊情况下,容器std::vectors的大小都相同。

例如,如果从第一个容器中删除了元素0、、35,我也希望从第二个容器中删除元素0、、3和。5

例如,可以预先计算一个容器来标记要删除的元素,构建一个谓词来remove_if简单地索引到标志容器中,然后erase-remove多次调用。

是否可以在没有预先计算的情况下做我想做的事?

0 投票
0 回答
779 浏览

c++ - 从 C++ 中的 txt.file/string 中删除标点符号

各位程序员,您好,我有一个问题,希望你们中的任何一个都能回答。下面的代码指出,在将 txt.file 放入字符串变量后,整个字符串(字符数组)将被删除任何标点符号并设置为小写字母。两个函数语句都运行良好,但是,引号和破折号(' " ', ' - ')没有从字符串中删除。我注释掉的 while 循环中的第二个语句是尝试删除引号的测试来自字符串,但这也不起作用。当我“计算”字符串时,我将其输出到另一个文本文件中。我不知道提供的信息是否有帮助,但任何建议都会非常感谢!

0 投票
2 回答
13355 浏览

c++ - 有没有更好的替代 std::remove_if 从向量中删除元素的方法?

从容器或其他容器中删除具有特定属性的元素的任务std::vector适用于函数式实现:为什么要为循环、内存释放和正确移动数据而烦恼?

然而,在 C++ 中执行此操作的标准方法似乎是以下成语:

此示例从整数向量中删除所有小于零的元素。

我发现它不仅丑陋,而且容易使用不正确。很明显,它std::remove_if不能改变向量的大小(正如它的名字所暗示的那样),因为它只会传递迭代器。但是许多开发人员,包括我自己,一开始并没有明白这一点。

那么有没有一种更安全、更有希望更优雅的方式来实现这一目标呢?如果不是,为什么?

0 投票
2 回答
350 浏览

c++ - 矢量使用迭代器擦除特定索引(不基于范围或条件)

说,我在代码中有两个向量,如下所示,我想使用 iterators擦除向量“data”中向量“index_to_filter”索引的元素。代码中的虚拟方式只是指出明显的错误。到目前为止,我无法让它工作,也不知道这是否可能是一个擦除删除成语?. 有没有办法并且我想念它?

谢谢。

PS:vector.erase 问题在这里被放弃了数十次,但没有找到这个问题的线索!

PS:不欢迎没有迭代器的解决方案。(没有冒犯的意思 !)

谢谢

0 投票
1 回答
527 浏览

c++ - 擦除()上的 unordered_map 重新设置

我不完全清楚是否unordered_map允许在执行重新哈希时执行erase()

很明显,在insert()使所有迭代器和引用无效的过程中可能会发生重新散列:

http://en.cppreference.com/w/cpp/container/unordered_map/insert

erase()似乎保留了所有迭代器和引用,除了那些被删除的:

http://en.cppreference.com/w/cpp/container/unordered_map/erase

但是,最后一页和标准表明erase()最差执行时间是O(size). 什么操作可以花费线性时间来完成并且不会以使迭代器无效的方式修改容器?

这篇文章表明迭代器在擦除期间无效:http: //kera.name/articles/2011/06/iterator-invalidation-rules-c0x/

我还在某处读到,未来的提案将允许重新散列erase()。真的吗?

如果确实发生了重新散列,那么旧的迭代和擦除算法是错误的,对吧?

0 投票
2 回答
437 浏览

c++ - 擦除字符串中第一个括号“(”和最后一个括号“(”之间的所有字符,包括这些括号 C++

我很难删除第一个括号“(”和最后一个括号“(”之间的所有字符,包括它们。这是我用来使其工作的测试程序,但没有成功......

在我上面展示的示例中,我的目标是(至少)获取字符串:

从原始字符串中提取

更准确地说,我想提取价值

并转换为 double 以便在计算中使用。

我已成功删除

因为它是一种常数值。

谢谢!