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,慢慢积累

原文地址:https://www.cnblogs.com/hua-dong/p/7898924.html