理解 std::erase 和 std::remove 之间的区别
std::remove 算法是一个多功能工具,旨在操作在任何前向迭代器对上,使其适用于广泛的容器和场景。与它的对应项 std::erase 不同,它有效地从容器中删除和移除元素,std::remove 只重新排列元素。
1。揭示 std::remove
std::remove 的细微差别的工作原理是将容器逻辑上划分为两个部分:一个包含要删除的元素的部分和一个包含剩余元素的部分。它通过迭代容器并将未删除的元素向前移动,有效地覆盖已删除的元素来实现这一点。但是,需要注意的是,std::remove 实际上并没有删除已删除的元素;而是删除了已删除的元素。它们保留在内存中,但实际上从视图中隐藏。
当将 std::remove 与容器 size() 函数结合使用时,此行为变得明显。使用 std::remove 删除元素后,std::size() 将继续返回容器的原始大小,即使某些元素在逻辑上被删除。容器的大小仅在使用 std::erase 物理删除隐藏元素后才会改变。
2。可视化 std::remove
的影响考虑原始问题中提供的代码片段:
std::vector a;
a.push_back(1);
a.push_back(2);
std::remove(a.begin(), a.end(), 1);
int s = a.size();
执行 std::remove 后,向量仍然包含两个元素(2 和 2),但第一个元素 (1) 被逻辑删除并从视图中隐藏。因此,尽管存在隐藏的已删除元素,std::size() 返回 2。
3。使用 std::erase 进行物理删除
要物理删除已删除的元素并更新容器的大小,std::erase 就发挥了作用。通过使用 std::remove 返回的迭代器对作为第一个参数调用 std::erase,您可以消除隐藏的已删除元素并减小容器的大小:
a.erase(std::remove(a.begin(), a.end(), 1), a.end());
在这种情况下,std::erase 物理删除元素 1,留下向量一个元素(2) 并更新大小 1.
4。了解 std::remove 实用程序的范围
虽然 std::remove 并非专门设计用于与 std::erase 结合使用,但它在逻辑分区的各种场景中都有广泛的用途。元素是必需的。例如,您可以使用 std::remove 来:
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3