返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中remove与erase实例分析
  • 178
分享到

C++中remove与erase实例分析

2023-06-29 11:06:20 178人浏览 安东尼
摘要

本篇内容介绍了“c++中remove与erase实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!erase 简介vector 

本篇内容介绍了“c++中remove与erase实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    erase 简介

    vector 中 erase 函数原型如下:

    iterator erase(    const_iterator position);iterator erase(    const_iterator first,    const_iterator last);

    用于删除 vector 容器中的一个或者一段元素

    在删除一个元素的时候,其参数为指向相应元素的迭代器;而在删除一段元素的时候,参数为指向一段元素的开头的迭代器以及指向结尾元素的下一个元素的迭代器

    调用 erase 后,vector 元素会向前移,因此需要格外注意这个特征,避免越界访问以及漏处理。

    示例代码:

    int main(int arGC, char *argv[]){vector<int> myVector;myVector.push_back(1);myVector.push_back(2);myVector.push_back(3);myVector.push_back(3);myVector.push_back(3);myVector.push_back(4);myVector.push_back(3);myVector.push_back(3);myVector.push_back(3);for (vector<int>::iterator itr = myVector.begin(); itr != myVector.end(); itr++) {if (*itr == 3) {//此时itr已经指向了新的下一个元素;如果不执行itr--与itr++做抵消,则会超出end导致崩溃。itr = myVector.erase(itr);itr--;}}cout << "[After erase] myVector: ";for (int temp : myVector)cout << temp << " ";cout << endl;return 0;}

    remove 简介

    alGorithm 中 remove 原型如下:

    template<class ForwardIterator, class Type>ForwardIterator remove(    ForwardIterator first,    ForwardIterator last,    const Type& value);template<class ExecutionPolicy, class ForwardIterator, class Type>ForwardIterator remove(    ExecutionPolicy&& exec,    ForwardIterator first,    ForwardIterator last,    const Type& value);

    remove 函数是由 STL 库中 algorithm 提供的一个函数,这里的 remove 字面意思很容易引起初学者误解。因为调用以后并非真实的 remove

    代码示例

    #include <vector>#include <iOStream>#include <algorithm>using namespace std;int main(int argc, char *argv[]){vector<int> array;array.push_back(1);array.push_back(2);array.push_back(3);array.push_back(3);array.push_back(4);array.push_back(5);cout << "init : ";print(array);array.erase(array.begin());cout << "erase array.begin() :";print(array);vector<int>::iterator remove2It = remove(array.begin(), array.end(), 2);cout << "remove 2 : ";print(array);cout << "remove2It traverse : ";for (; remove2It != array.end(); remove2It++)cout << *remove2It << " ";cout << endl;vector<int>::iterator remove3It = remove(array.begin(), array.end(), 3);cout << "remove 3 : ";print(array);cout << "remove3It traverse : ";for (; remove3It != array.end(); remove3It++)cout << *remove3It << " ";cout << endl;return 0;}

    运行后打印如下:

    init : 1 2 3 3 4 5
    erase array.begin() :2 3 3 4 5
    remove 2 : 3 3 4 5 5
    remove2It traverse : 5
    remove 3 : 4 5 5 5 5
    remove3It traverse : 5 5

    代码分析

    如上所示,执行 array.erase(array.begin()); 后,符合预期地将第一个元素删除了,打印结果为:erase array.begin() : 2 3 3 4 5

    在此基础(2 3 3 4 5)上执行 remove(array.begin(), array.end(), 2);,可能惯性思维会觉得得到的结果(这个是错误的结果,效果就像调用了 erase 一样)应该是 3 3 4 5,4 个元素。而实际打印结果为:3 3 4 5 5,5 个元素。这里完全“颠覆”了对 remove 这一字义的认识。

    remove 是如何工作的?

    查找资料后发现,remove 和 erase 存在很大的区别。

    remove 是 algorithm 的模板函数,它接收的都是迭代器参数,并不接收某个容器。remove 并不知道它作用于哪个容器,也不可能发现容器,因为没有办法从一个迭代器获得对应于它的容器。

    想要从容器中删除一个元素,唯一的方法就是调用容器的一个成员函数,比如 erase 函数。而 remove 无法知晓,故不可能根据一个传进来的迭代器进而在该容器中除去元素。因此,调用 remove 后并不会改变该容器的元素个数

    得出的结论是:remove 并不是真的在删除元素,因为它根本做不到

    remove 的工作流程

    C++中remove与erase实例分析

    (注意:begin 与 end 是左闭右开区间,即 end 是 vector 之外了,即 vector 最后一个元素的下一个。)

    这里需要明确一点是,remove() 的返回值是一个 iterator

    再来看 remove(3) 的过程:

    C++中remove与erase实例分析

    “C++中remove与erase实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: C++中remove与erase实例分析

    本文链接: https://lsjlt.com/news/324369.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • C++中remove与erase实例分析
      本篇内容介绍了“C++中remove与erase实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!erase 简介vector ...
      99+
      2023-06-29
    • 一起来学习C++中remove与erase的理解
      目录erase简介remove简介代码示例代码分析remove是如何工作的?remove的工作流程总结erase 简介 vector 中 erase 函...
      99+
      2024-04-02
    • C++中的类与对象实例分析
      今天小编给大家分享一下C++中的类与对象实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。初始化列表引论//初始化列表的...
      99+
      2023-06-29
    • C++类与对象实例分析
      这篇“C++类与对象实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++类与对象实例分析”文章吧。运算符重载C++语...
      99+
      2023-06-30
    • ConcurrentHashMap: get、remove方法的示例分析
      小编给大家分享一下ConcurrentHashMap: get、remove方法的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、get方法get方法:获取元素,根据目标key所在桶的第一个元素的不同采用不同的方...
      99+
      2023-06-15
    • Python与C++的引用实例分析
      这篇文章主要讲解了“Python与C++的引用实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python与C++的引用实例分析”吧!例子,这是我的两段根据先序序列创建二叉树的代码:#...
      99+
      2023-06-27
    • C++树与二叉树实例分析
      这篇“C++树与二叉树实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++树与二叉树实例分析”文章吧。树树的定义Q:...
      99+
      2023-06-30
    • C++中指针实例分析
      这篇文章主要介绍“C++中指针实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中指针实例分析”文章能帮助大家解决问题。计算机的内存模型CPU是计算机的核心部件,要想让一个CPU工作,就必...
      99+
      2023-06-19
    • C# XML实例分析
      本篇内容介绍了“C# XML实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C# XML解析的实现是如何的呢?下面我们来看看实现的方法...
      99+
      2023-06-17
    • C#中的反射实例分析
      今天小编给大家分享一下C#中的反射实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、获取程序集Assembly获取当...
      99+
      2023-06-30
    • C++中类与对象的示例分析
      这篇文章将为大家详细讲解有关C++中类与对象的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言:C 语言是面向过程的,关注的是过程,分析出求解的步骤,通过函数逐步调用解决问题。C++是基于面向对...
      99+
      2023-06-22
    • C++ 引用与内联函数实例分析
      这篇文章主要介绍“C++ 引用与内联函数实例分析”,在日常操作中,相信很多人在C++ 引用与内联函数实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++ 引用与内联函数实...
      99+
      2023-06-30
    • C语言分支与循环实例代码分析
      这篇文章主要介绍“C语言分支与循环实例代码分析”,在日常操作中,相信很多人在C语言分支与循环实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言分支与循环实例代码...
      99+
      2024-04-02
    • C语言循环与分支语句实例分析
      本篇内容主要讲解“C语言循环与分支语句实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言循环与分支语句实例分析”吧!写在开始0表示假,非0表示真。1. 分支语句分支语句也叫做条件选择语...
      99+
      2023-06-30
    • C++中类的大小实例分析
      这篇“C++中类的大小实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++中类的大小实例分析”文章吧。一、普通类的大...
      99+
      2023-06-29
    • C++中文件操作实例分析
      这篇文章主要介绍“C++中文件操作实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中文件操作实例分析”文章能帮助大家解决问题。文件操作意义:利用文件操作可以保存我们程序运行的信息,是持久...
      99+
      2023-07-02
    • C++中IO流操作实例分析
      这篇“C++中IO流操作实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++中IO流操作实例分析”文章吧。1.标准输...
      99+
      2023-07-02
    • C#中方法重载实例分析
      这篇文章主要介绍了C#中方法重载实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中方法重载实例分析文章都会有所收获,下面我们一起来看看吧。最近在看 C++ 的方法重载,我就在想 C# 中的重载底层是怎...
      99+
      2023-07-02
    • C#中的LINQ to Objects实例分析
      这篇文章主要介绍了C#中的LINQ to Objects实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中的LINQ to Objects实例分析文章都会有所收...
      99+
      2023-06-30
    • C#中协变与逆变的示例分析
      这篇文章主要介绍了C#中协变与逆变的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一:什么是协变与逆变协变指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类...
      99+
      2023-06-25
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作