• STL的erase函数和lower_bound


    前提摘要:

    【1】一般我们的区间是左闭右开,如下面例子2。

    【2】erase函数谨慎使用。

    【3】map也是有序保存的。

    【erase】

    1,删除字符串的首字母:

        string s="ecust";
        s.erase(s.begin());
        cout<<s<<endl;

    2,删除字符串的某些字母:(一般函数是左闭右开,所以下面是删除s[1],s[2],得到“est666”)

        string s="ecust666";
        s.erase(s.begin()+1,s.begin()+3);
        cout<<s<<endl;

    3,注意删除东西时不要直接用下标it++,可以执行下面代码试一试。(这只是其中一种错误,反正就是少用erase)

    比如删除‘3’,下面是错误代码,跳过了一个3,没有删干净。

    #include <iostream>
    #include <vector>
    using namespace std;
    vector<int> v;
    int main( ) {    
        int i;
        for (i=0;i<5;i++) {
            v.push_back( i );
            if (i==3) v.push_back( i );
        }
        vector<int>::iterator it=v.begin();
        for(;it!=v.end();it++) {  
              if ( *it==3) it= v.erase(it);
        }
        for(i=0;i<v.size();i++ ) 
            cout<<" i= "<<i<<", "<<v[i]<<endl;
        return 0;
    }

    以为删去一个后,后面的下标都提前了,不能直接it++

    说明删东西时下标就别++了,这里改一下就ok:

     for(;it!=v.end();) {  
            if ( *it==3) it= v.erase(it);
            else it++; 
     }

    4,删去数值大小范围在[a,b]的数。q是set等有序容器。

    (注意,这里的upper_bound得到的是开,erase也是开。保证了删除范围包括b。)

        q.erase(q.lower_bound(a),q.upper_bound(b));

     5,暂时想起这么点,慢慢积累

    【lower_bound】

    对于bound,返回位置下面一看就理解了吧。

    1,set(常见的有序容器)的lower_bound,如

    找到不超过x的最大数:

        scanf("%d",&a);
        set<int>:: iterator it=q.upper_bound(a);
        it--;
        printf("%d
    ",*it);

    2,map(也可以有序,想不到吧)的lower_bound(以第一关键字排序),如

    HDU4585

    map<int,int>::iterator it = mp.lower_bound(v);

    3,vector同理

    4,慢慢积累

  • 相关阅读:
    获取UltraWebTree指定节点的所有父节点内容
    OnClientClick
    ListControl控件经典用法
    DataTable添加列时容易被忽略的问题!
    利用数据库来填充UltraWebTree
    Web导出Word需要添加头文件
    程序中添加动态用户密码
    重构oninit,应用在模式窗口的方法
    防SQL注入
    获得connect string简单方法
  • 原文地址:https://www.cnblogs.com/hua-dong/p/7898924.html
Copyright © 2020-2023  润新知