c++ - 运行 remove_if() 后 vector.size() 的替代方法

标签 c++

我正在编写一段 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/

相关文章:

c++ - std::function segfault的自修改 vector

c++ - 获取一个Qt项目需要的所有include路径、lib等

c++ - 如何更改 QTreeWidgetItem 的一部分的背景或文本颜色

C++ std::istream readsome 不读取任何内容

c++ - 多重继承歧义错误

c++ - 如何将C++写入速度加速到CrystalDiskMark测试的速度?

c++ - 为类 std::vector<> 的结构成员重载 operator=

c++ - C++ 构造函数的异常说明符

C++ 标准 :string comparation codification problems

c++ - 使用 SFINAE 检测编译时是否存在重载的独立函数