千家信息网

C++中remove与erase实例分析

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,本篇内容介绍了"C++中remove与erase实例分析"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成
千家信息网最后更新 2025年01月20日C++中remove与erase实例分析

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

    erase 简介

    vectorerase 函数原型如下:

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

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

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

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

    示例代码:

    int main(int argc, char *argv[]){        vector 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::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 简介

    algorithmremove 原型如下:

    templateForwardIterator remove(    ForwardIterator first,    ForwardIterator last,    const Type& value);templateForwardIterator remove(    ExecutionPolicy&& exec,    ForwardIterator first,    ForwardIterator last,    const Type& value);

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

    代码示例

    #include #include #include using namespace std;int main(int argc, char *argv[]){        vector 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::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::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 是如何工作的?

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

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

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

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

    remove 的工作流程

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

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

    再来看 remove(3) 的过程:

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

    元素 容器 函数 迭代 指向 结果 分析 代码 参数 实例 实例分析 C++ 内容 原型 实际 时候 更多 知识 示例 简介 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小安时代互联网金融科技有限公司 西安网络安全it培训简单易学 中国生物医学文献数据库费用 南通天一网络技术有限公司 win2003打印服务器 电脑服务器硬盘拆卸 静安区营销软件开发厂家报价 网络安全行业的社会分析 剑网三登不上服务器 消防网络安全心得体会800字 软件开发职能流程规范 数据库可以存放blob吗 导航怎么看服务器名字 数据库的常用命令 导入数据库的关键词 叮点网络技术有限公司 服务器 迁移 方案 网络安全法 图片 怎么处理百万条数据库 大学生网络安全 ppt 浙江服务器机柜厂商有哪些 铁路网络安全和信息化 网络安全就业方向知乎 分布数据库有什么特点 我的世界服务器运行内存4g 新乡浩海网络技术有限公司 北京运营软件开发创新服务 华为路由ax3 虚拟服务器设置 怎么看服务器是不是装了两个系统 邮件无法验证服务器身份 已过期
    0