”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > C++ 中 `std::remove` 和 `std::erase` 有什么区别?

C++ 中 `std::remove` 和 `std::erase` 有什么区别?

发布于2024-11-11
浏览:226

 What\'s the Difference Between `std::remove` and `std::erase` in C  ?

理解 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 来:

  • 将满足特定条件的元素与不满足特定条件的元素分开。
  • 将相似的元素分组在一起。
  • 查找特定元素或元素集的位置。
最新教程 更多>
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-18
  • 如何使用 GopherLight 像专业人士一样在 Go 中编写 API
    如何使用 GopherLight 像专业人士一样在 Go 中编写 API
    文档 GopherLight 嘿伙计们,首先我要感谢您选择使用我们的项目。尽管他很小,但我们却以极大的热情做到了!要开始使用它,您首先必须安装 go,我们假设您已经安装了它。然后安装框架的主要模块,分别是req和router go get github.com/BrunoCicca...
    编程 发布于2024-11-18
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-18
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-18
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-11-18
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-18
  • 如何使用具有不同单位的无单位 CSS 变量?
    如何使用具有不同单位的无单位 CSS 变量?
    如何灵活地使用无单位 CSS 变量无单位 CSS 变量提供了存储数值的能力,这些数值可以在整个样式表中方便地使用。然而,可能会出现这样的情况:您希望在不同的上下文中使用相同的变量,需要不同的单位,例如百分比或像素。这种困境的一个例子是设置一个值为 10 的 CSS 变量,但是需要在一个实例中将其用作...
    编程 发布于2024-11-18
  • 当 #await 块在 Svelte(Kit) 中解析时运行函数
    当 #await 块在 Svelte(Kit) 中解析时运行函数
    跳至内容: 关于 svelte 中的 #await 块 当 #await 块解析或拒绝时运行(触发)函数 修复浏览器中显示的未定义或任何返回的文本 1. 方法一(返回空字符串): 2. 方法二(用CSS隐藏UI中函数返回的文本。) PS:需要雇用 SvelteKit 开发人员吗?联系我 ...
    编程 发布于2024-11-18
  • 一个 Java 文件中可以有多个类吗?
    一个 Java 文件中可以有多个类吗?
    Java 文件中的多个类在 Java 中,单个 .java 文件中可以有多个类。不过,公共顶级类只能有一个,而且必须与源文件同名。一个文件中有多个类的目的是为了组织逻辑上相关的代码。这些类通常包括公共顶级类的支持功能,例如内部数据结构或实用方法。通过将它们捆绑在一起,您可以将相关代码保留在一个位置,...
    编程 发布于2024-11-18
  • 如何有效测试PDO数据库连接并处理错误?
    如何有效测试PDO数据库连接并处理错误?
    测试PDO数据库连接开发数据库安装时,确保数据库连接的有效性至关重要。当尝试建立默认设置时,这一点变得尤为重要。 PDO(PHP 数据对象)提供了一种测试有效和无效连接的有效方法。验证连接要使用 PDO 连接到 MySQL 数据库,语法为:$dbh = new pdo('mysql:host=127...
    编程 发布于2024-11-18
  • 当现有值相同时,MySQL 更新查询是否会覆盖它们?
    当现有值相同时,MySQL 更新查询是否会覆盖它们?
    MySQL更新查询:覆盖现有值在MySQL中,更新表时,可能会遇到这样的情况:为列指定的新值是与其当前值相同。在这种情况下,自然会出现一个问题:MySQL 会覆盖现有值还是完全忽略更新?UPDATE 语句的 MySQL 文档提供了答案:如果将列设置为它当前拥有的值,MySQL 会注意到这一点并且不会...
    编程 发布于2024-11-18
  • 为什么 `std::atomic` 的存储使用 XCHG 来实现 x86 上的顺序一致性?
    为什么 `std::atomic` 的存储使用 XCHG 来实现 x86 上的顺序一致性?
    为什么 std::atomic 的存储采用 XCHG 来实现顺序一致性在 x86 和 x86_64 架构的 std::atomic 上下文中,a具有顺序一致性的存储操作 (std::memory_order_seq_cst) 采用 XCHG,而不是使用内存屏障作为简单存储实现顺序释放语义的技术。顺序...
    编程 发布于2024-11-18
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-18
  • 为什么 C++ 不直接支持从函数返回数组?
    为什么 C++ 不直接支持从函数返回数组?
    为什么 C 不赞成数组返回函数C 景观与 Java 等语言相反,C 不支持数组返回函数不为返回数组的函数提供直接支持。虽然可以返回数组,但过程很麻烦。这引发了有关此设计决策背后的根本原因的问题。C 中的数组机制要理解这一点,我们必须深入研究 C 中数组的基础知识。 C,数组名称代表内存地址,而不是数...
    编程 发布于2024-11-18
  • 好的,以下是一些适合文章内容的标题:

* How to Fix the \"-lGL: not found\" Error in Qt
* Qt Compilation Error: \"-lGL: not found\" - What to Do
* Troubleshooting \"-lGL: not found\" Error in Qt Projects
* Resolving the
    好的,以下是一些适合文章内容的标题: * How to Fix the \"-lGL: not found\" Error in Qt * Qt Compilation Error: \"-lGL: not found\" - What to Do * Troubleshooting \"-lGL: not found\" Error in Qt Projects * Resolving the
    解决 Qt 中的“-lGL:未找到”错误尝试在 QtCreator 中编译新创建的项目时,一些用户可能会遇到错误“-lGL:未找到”。此错误通常是因为未安装所需的依赖项而发生。要解决此问题,请按照以下步骤操作: 该软件包包含 Qt 项目中支持 OpenGL 所需的开发库。在 Ubuntu 上,您可...
    编程 发布于2024-11-18

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

Copyright© 2022 湘ICP备2022001581号-3