gpt4 book ai didi

c++ - 根据谓词从 std vector 中删除元素的有效方法

转载 作者:搜寻专家 更新时间:2023-10-31 01:49:22 26 4
gpt4 key购买 nike

我正在编写一个算法,该算法应该从存储在 vector 中的一组点中删除我提供的任何矩形列表中的每个元素。

我也将它用作 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;
}
);

这似乎是该问题的更简单的解决方案,创建一个必须从点集中排除的边界 vector ,然后迭代设置点。我想知道是否有更好的方法来解决这个问题。我想指出点集可能很大,而矩形集确实足够有限。

最佳答案

您可以将 auto 更改为 auto const&,因为您不需要在遍历时为 limits 中的每个矩形创建拷贝集合:

for (auto const& limit : limits)
// ^^^^^^

这应该会带来一些性能改进(但一如既往,当涉及到性能时,在得出任何结论之前先对其进行测量)。

此外,除非您需要创建从 vector 中删除的元素的拷贝(问题的文本未提及这一点),否则您可以使用 std::remove_if()而不是 std::remove_copy_if()

std::remove_if() 的工作原理是用后续元素覆盖已移除的元素,并将返回 vector 的新逻辑末尾,而无需实际调整 vector 本身的大小(如果您这样做,这是一种理想的行为不需要那样做)。

因此,是否调用 std::vector::erase() 取决于您。在 std::remove_if() 之后。这是 a very common practice which also has a name .

关于c++ - 根据谓词从 std vector 中删除元素的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16675891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com