STL : set & multiset
set和multiset都能对插入的元素进行自动排序,还能查前驱后继什么的,可以部分代替平衡树的功能。
使用STL虽然常数大,但是可以减少码量,避免手打平衡树出现错误,提高代码准确度。
set和multiset的区别就在于,set不支持重复元素,multiset支持重复元素。
所以这里以set为例,讲一下最最基本的函数~
定义set:set<int>s;
迭代器:set<int>::iterator xxx;
插入元素:s.insert(num);
删除元素:s.erase(num);
s.erase(一个数):会删掉与这个数相等的所有元素。
s.erase(迭代器):只会删掉这个迭代器指向的元素。
查询元素个数(multiset里比较有用):s.count(num);
前驱:lower_bound(num)-1;
后继:upper_bound(num);
set的头和尾:s.begin(),s.end()-1;(s.end()为空)
具体的看代码吧。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<set> 5 6 // 迭代器 7 #define ite set<int>::iterator 8 9 using namespace std; 10 11 // 定义 12 set<int>s; 13 14 int main() 15 { 16 // 插入 17 s.insert(5); 18 s.insert(6); 19 s.insert(15); 20 s.insert(20); 21 22 // 最小值、最大值 23 ite first,last; 24 first=s.begin(); 25 last=s.end();last--; 26 printf("%d %d\n",*first,*last); 27 28 // 前驱后继 29 ite pre,post; 30 pre=s.lower_bound(10);pre--; 31 post=s.upper_bound(10); 32 printf("%d %d\n",*pre,*post); 33 34 // 删除元素 35 s.erase(6); 36 37 // 查询元素个数,multiset里比较有用 38 printf("%d\n",s.count(6)); 39 40 // 前驱后继*2 41 pre=s.lower_bound(10);pre--; 42 post=s.upper_bound(10); 43 printf("%d %d\n",*pre,*post); 44 45 return 0; 46 }
注释是不是很良心QWQ