我正在编写一段 C++ 检查 vector 的特定元素是否返回 true,如果不是则使用 remove_if()
删除它们。之后,我使用 vector.size()
检查 vector 中是否还有任何元素,如果没有则返回该函数。
目前,我在 remove_if()
之后执行 vector.erase()
,因为它实际上并没有减少 vector 的大小。然而,这段代码需要快速运行,递归地改变内存中 vector 的大小可能并不理想。但是,如果 vector 为零则返回(而不是运行函数的其余部分)也可能会节省时间。
有没有一种很好的方法可以在不删除的情况下检查 vector 中还有多少元素?
代码如下:
auto remove = remove_if(sight.begin(), sight.end(), [](const Glance *a) {
return a->occupied;
});
sight.erase(remove, sight.end());
if (sight.size() == 0) {
// There's nowhere to move
return;
}
编辑:
感谢您的帮助+指导。从答案中可以明显看出问题的措辞不太正确:erase()
不会改变内存中 vector 的大小,但会改变容量。我记错了 this post 的解释,这很好地阐明了为什么 erase()
比 remove()
慢多次删除(因为您必须多次复制 vector 中元素的位置)。
我使用 Instruments 对我最初根据 Johannes 的建议编写的代码进行了基准测试,差异很小,尽管 Johannes 的速度始终稍快(~9.8% 权重与 ~8.3% 权重,否则相同的代码)。链接的文章应该解释原因。 ✨
最佳答案
您可以使用 std::distance(sight.begin(), remove);
获取剩余元素的数量:
auto remove = remove_if(sight.begin(), sight.end(), [](const Glance *a) {
return a->occupied;
});
size_t remaining = std::distance(sight.begin(), remove);
if (remaining == 0) {
// There's nowhere to move
return;
}
但是如果你只对 0
感兴趣,你可以这样做:
auto remove = remove_if(sight.begin(), sight.end(), [](const Glance *a) {
return a->occupied;
});
if (remove == sight.begin()) {
// There's nowhere to move
return;
}
关于c++ - 运行 remove_if() 后 vector.size() 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54675992/