”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么在 C++ 中 `std::remove` 会重新排列元素而不是删除它们?

为什么在 C++ 中 `std::remove` 会重新排列元素而不是删除它们?

发布于2024-11-19
浏览:181

  Why Does `std::remove` Rearrange Elements Instead of Deleting Them in C  ?

理解差异:擦除与删除

在 C 编程领域,std::erase 和 std::remove 是两个在修改容器时,不同的功能有不同的用途。虽然这两个函数都可用于从容器中删除元素,但它们的行为有所不同。

Std::remove:重新排列元素与删除

Std::删除是一种对一系列元素进行操作并在容器内重新排列它们的算法。它不会直接删除任何元素,而是将不匹配的元素移动到匹配的元素之上。此过程在序列的开头创建匹配元素的簇,在序列末尾创建不匹配元素的簇。

Std::erase:删除元素

上另一方面,std::erase 是一个从容器中删除指定元素的函数,从而有效地减小其大小。它采用一系列迭代器作为参数,并删除该范围内的所有元素,包括标记为删除的元素。

理解输出

在提供的代码示例中,可以进行以下观察:

  1. Std::remove: 当 std::remove 不使用时std::erase,它只是重新排列元素,保持向量的大小不变。因此,迭代向量将导致输出 2,2.
  2. Std::erase: 当 std::erase 与 std::remove 结合使用时,它会删除匹配元素(在本例中为 1 的单次出现)并相应地更新向量的大小。因此,输出仅显示 2.

Std::remove

  1. Erase-Remove 之外的使用的附加说明习惯用法: 虽然 std::remove 通常与擦除一起使用作为“擦除删除习惯用法”的一部分,但也可以使用它独立。它在删除顺序并不重要且主要目标是分离容器内匹配和不匹配元素的场景中非常有用。
  2. 非删除的基本原理: 的设计std::remove 不涉及删除源于它能够与任意前向迭代器一起使用。此类迭代器可能无法删除元素,因此 std::remove.
的功能有限
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3