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()+,s.begin()+);
cout<<s<<endl;

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

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

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

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

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

 for(;it!=v.end();) {
if ( *it==) 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,返回位置下面一看就理解了吧。

STL的erase函数和lower_bound

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

找到不超过x的最大数:

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

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

HDU4585

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

3,vector同理

4,慢慢积累

上一篇:解决The hierarchy of the type is inconsistent错误


下一篇:正确使用stl vecotr erase函数