问题标签 [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.
c++ - 在 C++ 中使用条件在循环中擦除
有没有更好的写法:
这段代码可以满足我的要求,但感觉风格很糟糕。
我该如何改进它?
我的容器是std::map
,但通用解决方案会很酷。
c++ - std::remove_if 是否保证按顺序调用谓词?
std::remove_if 总是按顺序调用每个元素的谓词(根据迭代器的顺序)还是可以乱序调用?
这是我想做的一个玩具示例:
我需要处理和删除满足特定标准的向量的所有元素,而 erase + remove_if 似乎非常适合。但是,我要做的处理有副作用,我需要确保处理按顺序进行(在玩具示例中,假设我想按照它们在原始向量中出现的顺序打印值)。
假设我的谓词将按顺序在每个项目上调用是否安全?
我假设 C++17 的执行策略会消除歧义,但由于 C++17 还没有出现,这显然对我没有帮助。
编辑:另外,这是个好主意吗?还是有更好的方法来实现这一点?
c++ - 使用erase-remove_if 成语
假设我有std::vector<std::pair<int,Direction>>
.
我正在尝试使用 erase-remove_if 习惯用法从向量中删除对。
我想删除所有将 .first 值设置为 4 的对。
在我的示例中,我有对:
但是,在我执行erase-remove_if 之后,我只剩下:
我在这里做错了什么?
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()
,所以我知道问题出在我的比较表达式中。
我的演示也更新了。
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>)> >]'
c++ - 如何检查擦除删除操作是否成功?
这是我第一次使用这个习语,我有一个向量v1
,其中元素必须是另一个向量中元素的子集v2
。现在,想象v1
和作为集合,如果不存在(对于任何有意义的) v2
,我想执行v2-v1
并抛出异常。v1[i]
v2
i
我想出了这个:
我该如何填写if
条件?
c++ - erase-remove_if 成语 - 有什么东西被删除了吗?
我正在创建一个 API,用户将调用它来从内部向量中删除项目。他们将传入标准以搜索向量以查找要删除的元素。如果找到并删除了任何元素,我希望我的 API 返回一个布尔值。
我打算使用擦除删除成语来保持简单和高效。我没有看到一种明显的方法来检测项目实际上已被删除?我最好的选择是在删除之前存储向量中的元素数量并比较值吗?
以下是有关此成语的一些(未经测试的)示例代码:
c++ - 擦除删除习语的性能增益来自哪里
我需要从满足特定标准的向量中删除所有元素。
我的第一种方法是遍历向量并在所有满足条件的元素上调用 vector::erase。
据我了解,vector::erase
此用例的性能很差,因为它会从底层数组中删除该项目,并将向量的其余部分向前移动一个元素(如果删除一系列元素,则向前移动更多)。当您删除多个元素时,后面的元素将在每次删除时移动。
该remove
算法将所有要删除的元素移到向量的末尾,因此您只需删除向量的后部,这不涉及移位。
但是为什么这比擦除更快呢?(是不是更快?)
将一个元素移动到最后是否意味着将所有以下元素向前移动vector::erase
?
怎么会,那个 remove 的复杂度只有 O(n)?
c++ - 如何从向量中删除具有给定名称的玩家
在尝试从向量中删除字符串时,我看到了一些严重的错误消息。我正在尝试使用擦除删除成语,但它不起作用。这里有一些片段来说明我的困境。
team.players 在这个结构中声明:
向量 team.players 在程序运行时动态填充,并且在某些时候,用户可以选择通过菜单删除玩家。
但是,当我试图编译我的程序(clang++)时,我得到了这些错误,早在调用函数之前。以下是错误:
知道如何解决这个问题吗?
c++ - Lambda 表达式采用向量中包含的唯一指针
我有一个foos
指向我的资源类型的唯一指针向量Foo
。我想删除其中一些满足给定条件的内容。我该怎么做?
看起来我正在复制unique_ptr
,所以我收到以下错误,
我该怎么做?我不会使用该资源。我不关心超出这一点的所有权。