zoukankan      html  css  js  c++  java
  • vector删除元素浅析

    <<effectSTL>>书中提到erase-remove方法  即c.rease(remove(c.begin(),c.end(),1963),c.end())

    关于remove这里有一篇文章 http://blog.csdn.net/vbanglev/archive/2007/02/22/1512521.aspx

    -------------------------------------------------------------------------------------------------------------------------------------------------------

    下面开始真正的内容

    上代码

    #include<iostream>
    #include<vector>
    using namespace std;
    int main(){
        vector<int> v;
        v.push_back(1);
        v.push_back(2);
        v.push_back(3);
        v.push_back(4);
        vector<int>::iterator i;
        for(i=v.begin();i!=v.end();i++){
            cout<<*i<<endl;
            
        }
    <img src="//img-blog.csdn.net/20160212210215830?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
        for(i=v.begin();i!=v.end();){
            cout<<*i<<endl;
            if(*i==3){
                i=v.erase(i);//正确写法
                /*v.erase(i); 不推荐的写法但事实上可以,因为vector是连续内存的容器
                  v.erase(i++); 另外一种错误写法,因为vector是连续内存的容器(序列容器),但对于关联容器这种写法
    是对的
                */
            }
            else
                i++;
        }
    <img src="//img-blog.csdn.net/20160212210756009?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
        for(i=v.begin();i!=v.end();i++){
            cout<<*i<<endl;
            
        }
        return 0;
    }
    vector的erase函数返回的迭代器并没有向后增加(原地踏步),事实上erase函数将要删除的元素之后的迭代器整体向前迁移以达到删除效果(end()也被迁移) 这也可以解释为什么在 i 没有被erase函数的返回值赋值的情况下程序依旧可以运行

    对于关联容器则没有上面的特性


  • 相关阅读:
    蓝桥杯——一步之遥,扩展gcd的应用
    质数唯一分解定理应用——多个数的最小公约数和最大公倍数
    蓝桥杯训练 ——天平称重
    蓝桥杯 奇怪的捐赠——进制的运用
    Kubernetes-基本概念
    Docker-基本概念
    虚拟化向容器化发展
    Kubernetes-服务连接和暴露(endpoints资源)
    Kubernetes-NodePort
    Kubernetes-Load Balancer
  • 原文地址:https://www.cnblogs.com/odin-luyu/p/5371773.html
Copyright © 2011-2022 走看看