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

c++ - 在 C++ 中使用条件在循环中擦除

有没有更好的写法:

这段代码可以满足我的要求,但感觉风格很糟糕。

我该如何改进它?

我的容器是std::map,但通用解决方案会很酷。

0 投票
2 回答
1006 浏览

c++ - std::remove_if 是否保证按顺序调用谓词?

std::remove_if 总是按顺序调用每个元素的谓词(根据迭代器的顺序)还是可以乱序调用?

这是我想做的一个玩具示例:

我需要处理和删除满足特定标准的向量的所有元素,而 erase + remove_if 似乎非常适合。但是,我要做的处理有副作用,我需要确保处理按顺序进行(在玩具示例中,假设我想按照它们在原始向量中出现的顺序打印值)。

假设我的谓词将按顺序在每个项目上调用是否安全?

我假设 C++17 的执行策略会消除歧义,但由于 C++17 还没有出现,这显然对我没有帮助。

编辑:另外,这是个好主意吗?还是有更好的方法来实现这一点?

0 投票
2 回答
18840 浏览

c++ - 使用erase-remove_if 成语

假设我有std::vector<std::pair<int,Direction>>.

我正在尝试使用 erase-remove_if 习惯用法从向量中删除对。

我想删除所有将 .first 值设置为 4 的对。

在我的示例中,我有对:

但是,在我执行erase-remove_if 之后,我只剩下:

我在这里做错了什么?

0 投票
1 回答
95 浏览

c++ - 无法从非原始数据类型的向量中按 ID 删除元素

我有一个用户定义数据类型的向量city。我试图通过它的 ID 从这个向量中删除一个元素;最终,所有城市都会从这个列表中while(!cityList.empty())循环删除。我打算使用erase-remove 成语来完成此操作。

但是,当我调用remove(). 将city对象作为第三个参数传入会remove()导致此错误,就像传入city. 此错误不会发生erase(),但会发生remove(),并且find()如果我尝试使用它。这是有问题的代码:

这是我的问题的更新的简单,最小的演示

错误消息包括“模板参数推导/替换失败”“'city' 不是从 'const _gnu_cxx::__normal_iterator<_IteratorL, _Container>' 派生的”消息,我无法在网上找到任何与我的上述错误的问题。

编辑:我已经修改了我的代码,现在我有了:

我在尝试编译时收到的错误是:

这更接近,但我不确定需要什么。然而,这条线main.cpp:30:90指向cityList[i] == cityToRemove我的函数的一部分cityList.erase(),所以我知道问题出在我的比较表达式中。

我的演示也更新了。

0 投票
1 回答
254 浏览

c++ - C++ 用对象擦除删除习语

编辑: @Holt 帮助了我,如果 hasCollided 是非静态的,解决方案是传递一个 Engine 实例:

我有一个函数,无论砖块是否被球击中,它都会返回真或假。

我想擦除从矢量击中的砖块。我设法让这个习语使用简单的数字向量和一个 bool 函数,但是当我尝试对对象向量进行同样的操作时,我得到了奇怪的错误。

私人会员:

碰撞检查:

我的尝试:

错误发生在predefined_ops.h右边:

编译器会吐出 92 个错误。请帮我解决这个问题

示例错误:

required from '_ForwardIterator std::__remove_if(_ForwardIterator, _ForwardIterator, _Predicate) [with _ForwardIterator = __gnu_cxx::__normal_iterator<Game::Brick*, std::vector<Game::Brick> >; _Predicate = __gnu_cxx::__ops::_Iter_pred<std::_Bind<std::_Mem_fn<bool (Game::Engine::*)(Game::Ball&, Game::Brick&)>(Game::Ball, std::_Placeholder<1>)> >]'

0 投票
1 回答
2315 浏览

c++ - 如何检查擦除删除操作是否成功?

这是我第一次使用这个习语,我有一个向量v1,其中元素必须是另一个向量中元素的子集v2。现在,想象v1和作为集合,如果不存在(对于任何有意义的) v2,我想执行v2-v1并抛出异常。v1[i]v2i

我想出了这个:

我该如何填写if条件?

0 投票
3 回答
1513 浏览

c++ - erase-remove_if 成语 - 有什么东西被删除了吗?

我正在创建一个 API,用户将调用它来从内部向量中删除项目。他们将传入标准以搜索向量以查找要删除的元素。如果找到并删除了任何元素,我希望我的 API 返回一个布尔值。

我打算使用擦除删除成语来保持简单和高效。我没有看到一种明显的方法来检测项目实际上已被删除?我最好的选择是在删除之前存储向量中的元素数量并比较值吗?

以下是有关此成语的一些(未经测试的)示例代码:

0 投票
2 回答
1340 浏览

c++ - 擦除删除习语的性能增益来自哪里

我需要从满足特定标准的向量中删除所有元素。

我的第一种方法是遍历向量并在所有满足条件的元素上调用 vector::erase。

据我了解,vector::erase此用例的性能很差,因为它会从底层数组中删除该项目,并将向量的其余部分向前移动一个元素(如果删除一系列元素,则向前移动更多)。当您删除多个元素时,后面的元素将在每次删除时移动。

remove算法将所有要删除的元素移到向量的末尾,因此您只需删除向量的后部,这不涉及移位。

但是为什么这比擦除更快呢?(是不是更快?)

将一个元素移动到最后是否意味着将所有以下元素向前移动vector::erase

怎么会,那个 remove 的复杂度只有 O(n)?

0 投票
3 回答
230 浏览

c++ - 如何从向量中删除具有给定名称的玩家

在尝试从向量中删除字符串时,我看到了一些严重的错误消息。我正在尝试使用擦除删除成语,但它不起作用。这里有一些片段来说明我的困境。

team.players 在这个结构中声明:

向量 team.players 在程序运行时动态填充,并且在某些时候,用户可以选择通过菜单删除玩家。

但是,当我试图编译我的程序(clang++)时,我得到了这些错误,早在调用函数之前。以下是错误:

知道如何解决这个问题吗?

0 投票
1 回答
581 浏览

c++ - Lambda 表达式采用向量中包含的唯一指针

我有一个foos指向我的资源类型的唯一指针向量Foo。我想删除其中一些满足给定条件的内容。我该怎么做?

看起来我正在复制unique_ptr,所以我收到以下错误,

我该怎么做?我不会使用该资源。我不关心超出这一点的所有权。