根据谓词从std向量中删除元素的有效方法
Efficient way to remove elements from std vector according to predicate
我正在编写一个算法,该算法应该从存储在向量中的一组点中删除我提供的任何rect列表中的每个元素。
我也用它作为c++ 11的测试场,所以,因为我还在适应新特性,我想知道这是一种有效的方法,还是它有一些我没有得到的特殊缺陷。
vector<tuple<u16, u16, u16, u16>> limits;
FOR_EACH_AREA_TO_REMOVE
limits.push_back(make_tuple(
area->x - VIEWPORT_SIZE_X/2,
area->x + VIEWPORT_SIZE_X/2,
area->y - VIEWPORT_SIZE_Y/2,
area->y + VIEWPORT_SIZE_Y/2));
FOR_EACH_AREA_TO_REMOVE_END
vector<Point2D> points;
remove_copy_if(suitablePoints.begin(), suitablePoints.end(),
points.begin(), [&](const Point2D &point) {
for (auto limit : limits)
if (point->x > get<0>(limit) &&
point->x < get<1>(limit) &&
point->y > get<2>(limit) &&
point->y < get<3>(limit))
return true;
return false;
}
);
这似乎是这个问题的更平凡的解决方案,创建一个必须从点集中排除的边界向量,然后迭代集点。我想知道是否有更好的方法来解决这个问题。我想指出的是,点的集合可以是巨大的,而矩形的集合确实是足够有限的。
您可以将auto
更改为auto const&
,因为您不需要在迭代集合时创建limits
中每个矩形的副本:
for (auto const& limit : limits)
// ^^^^^^
这应该会带来一些性能改进(但是当涉及到性能时,在得出任何结论之前都要进行测量)。
此外,除非您需要创建从向量中删除的元素的副本(问题的文本没有提到这一点),否则您可以使用std::remove_if()
而不是std::remove_copy_if()
。
std::remove_if()
通过用后续元素覆盖被删除的元素来工作,并且将返回vector的新逻辑末端,而无需实际调整vector本身的大小(如果不需要这样做,这是一种理想的行为)。
因此,是否通过在std::remove_if()
之后调用std::vector::erase()
来执行此操作取决于您。这是一种非常常见的做法,也有一个名称。
相关文章:
- C++如何通过用户输入删除列表元素
- 使用函数"remove"删除重复元素
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- 如何从存储在std::映射中的std::集中删除元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 删除列表中的第n个元素
- 从矢量中删除元素后出现隔离错误
- 删除映射和分割错误中的一个过去结束元素
- 如何使用remove_if从矢量中删除元素
- 如何从使用 for 循环中的矢量大小的矢量中删除元素
- 从矢量中删除空元素
- 关于比较两个无序数组并删除 a[] 中可以在 b[] 中找到的元素的问题
- 删除指针数组 (C++) 中的元素
- 删除列表 c++ 中的最后 3 个元素
- 比较 2 个向量并从第二个向量中删除在第一个 - c++ 中找不到的元素
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 从std::multiset的第i个元素删除到末尾
- 删除 [] 是否等于每个元素删除.C++
- std::列出元素删除后节点的内存回收