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

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

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

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

  • 将满足特定条件的元素与不满足特定条件的元素分开。
  • 将相似的元素分组在一起。
  • 查找特定元素或元素集的位置。
最新教程 更多>
  • NULL值对MySQL性能和存储的影响:不同引擎的解析
    NULL值对MySQL性能和存储的影响:不同引擎的解析
    [2 [2 根据所选的存储引擎,零值对MySQL的性能和存储的效果都有很大变化。 [2 存储效率:[2 重要的是要记住,对零值的优化通常被视为微优化。 性能增长通常微不足道。 优先考虑精心设计的索引和足够的数据库缓存通常会提供更大的性能改进。
    编程 发布于2025-04-12
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 ; $ date->修改('1个月'); //前进1个月 echo $ date->...
    编程 发布于2025-04-12
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 中,如果您使用一个大文件,并且需要从最后一行读取其内容,则在第一行到第一行,Python的内置功能可能不合适。这是解决此任务的有效解决方案:反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] ...
    编程 发布于2025-04-12
  • jQuery光标操作6大函数
    jQuery光标操作6大函数
    以下是一些强大的jQuery代码片段,用于操作鼠标光标!它们可以用于设置和获取输入和文本区域字段中的文本光标位置以及选择范围。尽情享受吧! // jQuery 获取光标位置函数调用示例 $("input[name='username']").getCursorPosition(); jQuery....
    编程 发布于2025-04-12
  • C++中Unnamed Namespaces与Static关键字:谁更优越封装?
    C++中Unnamed Namespaces与Static关键字:谁更优越封装?
    Unveiling the Superiority of Unnamed Namespaces over the Static KeywordIntroduction:The use of the static keyword has been consistently questioned in ...
    编程 发布于2025-04-12
  • Go类型别名导致类型断言失败的原因
    Go类型别名导致类型断言失败的原因
    [2 导入“ FMT” 键入Funcy Func(int)bool Func Funcy(I Int)Bool { 返回i%2 == 0 } func main(){ var a界面{} = funcy _ = a。(func(int)布尔)// fmt.printl...
    编程 发布于2025-04-12
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-04-12
  • NOT EXISTS vs. NOT IN vs. LEFT JOIN NULL: 选哪个SQL子句?
    NOT EXISTS vs. NOT IN vs. LEFT JOIN NULL: 选哪个SQL子句?
    [2 理解sql的,不存在,:比较分析 SQL提供了各种方法,用于比较跨表的数据并根据零值过滤结果。 掌握[之间的差异,, [2 这两个子句在相关表中检查没有匹配行的情况。 它们的关键区别在于无效处理: 不存在在中不在:returns true 仅在不存在非null匹配时。 任何nulls...
    编程 发布于2025-04-12
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    编程 发布于2025-04-12
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-04-12
  • jQuery.height()为何返回隐藏元素的值?
    jQuery.height()为何返回隐藏元素的值?
    在这种情况下,具有ID“ target”的元素具有通过CSS设置为“无”的元素。但是,当使用$(“#target”)检查其高度时。 If an element has an offsetWidth of 0 (considered "hidden" by jQuery), th...
    编程 发布于2025-04-12
  • HTML5全屏API使用指南 - SitePoint
    HTML5全屏API使用指南 - SitePoint
    If you don’t like change, perhaps web development isn’t for you. I previously described the Full-Screen API in late 2012 and, while I claimed the im...
    编程 发布于2025-04-12
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-04-12
  • Java中ArrayList转String\[\]数组方法
    Java中ArrayList转String\[\]数组方法
    在java Converting using toArray() MethodThe toArray() method is a convenient way to convert an ArrayList to a String[].它接受数组作为参数,其中的元素被复制到其中。以下代码片段演示了...
    编程 发布于2025-04-12
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-04-12

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

Copyright© 2022 湘ICP备2022001581号-3