首页 >后端开发 >C++ >为什么使用 Erase-Remove_if 习惯用法从向量中删除元素不能按预期工作?

为什么使用 Erase-Remove_if 习惯用法从向量中删除元素不能按预期工作?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-16 15:01:02831浏览

Why Does Using the Erase-Remove_if Idiom to Remove Elements From a Vector Not Work As Expected?

理解用于向量删除的erase-remove_if 惯用法

在 C 语言中,erase-remove_if 惯用法被广泛用于从基于给定标准的向量。让我们深入研究这个习惯用法被错误实现的具体示例,并探索潜在的陷阱。

问题:

考虑一个名为 stopPoints 的向量,其中包含整数对和方向价值观。目标是使用erase-remove_if 惯用法从向量中删除包含特定整数(例如 4)的所有对。然而,执行代码后,结果出乎意料。

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [&](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }));

执行此操作后,向量中仍然包含 .first 值设置为 4 的对的实例。

解决方案:

错误在于擦除功能的错误使用。在erase-remove_if习惯用法中,std::erase函数需要两个迭代器——一个是指向要删除的第一个元素的迭代器,另一个是指向容器末尾的迭代器。

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [](const stopPointPair stopPoint)-> bool
                                       { return stopPoint.first == 4; }),
                 stopPoints.end());

在这个更正的实现中,从 std::remove_if 返回的迭代器(指向要删除的第一个元素)到向量末尾的范围被擦除,有效地删除与谓词(.first)匹配的所有元素== 4 在本例中)。

解释:

  • std::remove_if 扫描向量,移动与谓词匹配的元素(带有 .first 的元素) == 4) 到最后。
  • std::remove_if 返回一个指向的迭代器与谓词不匹配的第一个元素(即要保留的第一个元素)。
  • std::erase 删除从返回的迭代器到向量末尾的元素范围,从而有效地删除带有 .first 的所有元素== 4.

结论:

eras-remove_if 惯用语是一个强大的工具,可以有效地从向量中删除满足特定条件的元素。了解函数 std::remove_if 和 std::erase 如何交互对于其正确实现至关重要。

以上是为什么使用 Erase-Remove_if 习惯用法从向量中删除元素不能按预期工作?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn