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\n",*it);
2,map(也可以有序,想不到吧)的lower_bound(以第一关键字排序),如
map<int,int>::iterator it = mp.lower_bound(v);
3,vector同理
4,慢慢积累
It is your time to fight!