这个set 写的我头皮发麻。
记住几个点:
1. set.end(); 永远都别用,不知道是不是自己机器的问题,一直显示=初识的那个值。 我们要调用最后一个的时候 正确的用法应该是: *(–q.end() ),亲测可用。
- lower_bound :
set::iterator it;
it=q.lower_bound(pre[x]); it返回的是地址。 取值的话 用一下*就可以了。
3.删除 erase !!!
这个依然不是很懂。 删除单个键值的时候直接用就可以q.erase(it);
但是 如果用q.erase(it,it); 亲测 是不可以用的,不知道有哪些奇怪的错误。
erase(iterator) ,删除定位器iterator指向的值
erase(first,second),删除定位器first和second之间的值
这个显然可以配合 lower_bound,以及upper_bound (顺便复习一下,返回>x的第一个值)
或者 配合 end()?
亲测 : 其区间 应该是[l,r) 所以我们应该配合 end来使用。
int main()
{
set<int> s;
set<int>::const_iterator iter;
set<int>::iterator first;
set<int>::iterator second;
for(int i = 1 ; i <= 10 ; ++i)
{
s.insert(i);
}
first = s.begin(); // 1
second = s.begin();
second++; // 2
second++; // 3
s.erase(first,second);
for(iter = s.begin() ; iter != s.end() ; ++iter)
cout<<*iter<<" ";
cout<<endl;
return 0;
}
输出:3 4 5 6 7 8 9 10
改成 s.erase(second,s.end());
输出 1 2 ,证明确实可以配合 end() 一起使用。
erase(key_value),删除键值key_value的值
4.find
it=q.find(x) ,如果没有 会返回 q.end(); 这个end可能是一个莫名其妙的值吧。。。
反正我们认为最后一个是 (–q.end()) 应该就没错。