前提摘要:
【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,返回位置下面一看就理解了吧。
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,慢慢积累