100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > C++ STL (四)set使用

C++ STL (四)set使用

时间:2019-10-30 22:59:32

相关推荐

C++ STL (四)set使用

概述 主要用途:去重、排序

set中没有重复的元素,set中的元素都是排好序的。set内部采用的是一种非常高效的平衡检索二叉树:红黑树,也称为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树。插入、查找、删除时间复杂度均为O(logn)

简单操作

#include <iostream>#include <set>using namespace std;int main(){set<int> s;s.insert(1);s.insert(2);s.insert(3);s.insert(1);cout<<"set 的 size 值为 :"<<s.size()<<endl;cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl;cout<<"set 中的最后一个元素是:"<<*s.end()<<endl;s.clear();if(s.empty()){cout<<"set 为空 !!!"<<endl;}cout<<"set 的 size 值为 :"<<s.size()<<endl;cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;return 0;}

begin(); // 返回指向第一个元素的迭代器end(); // 返回指向最后一个元素的迭代器

插入3之后虽然插入了一个1,但是我们发现set中最后一个值仍然是3,这就是set 。还要注意begin()和 end()函数是不检查set是否为空的,使用前最好使用empty()检验一下set是否为空.

count()用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。

示例代码:

#include <iostream>#include <set>using namespace std; int main(){set<int> s;s.insert(1);s.insert(2);s.insert(3);s.insert(1);cout<<"set 中 1 出现的次数是 :"<<s.count(1)<<endl;cout<<"set 中 4 出现的次数是 :"<<s.count(4)<<endl;return 0;}

erase(iterator),删除定位器iterator指向的值

erase(first,second),删除定位器first和second之间的值

erase(key_value),删除键值key_value的值

#include <iostream>#include <set>using namespace std;int main(){set<int> s;set<int>::iterator it;set<int>::const_iterator iter;set<int>::iterator first;set<int>::iterator second;for(int i = 1 ; i <= 10 ; ++i){s.insert(i);cout << i << " " ;}cout << endl;it = s.begin();cout << "第一次删除的是:" << *it << endl;s.erase(s.begin());cout << "第一种删除之后 :" << endl; for(iter = s.begin() ; iter != s.end() ; ++iter){cout<<*iter<<" ";}cout << endl;first = s.begin();second = s.begin();second++;second++;cout << "l == " << *first << " r == " << *second << endl;cout << "第二种删除之后 :" << endl; s.erase(first,second);for(iter = s.begin() ; iter != s.end() ; ++iter){cout<<*iter<<" ";}cout << endl;s.erase(8);cout << "第三次删除的是: 8" << endl;cout<<"第三种删除后 set 中元素是 :";for(iter = s.begin() ; iter != s.end() ; ++iter){cout<<*iter<<" ";}cout << endl;return 0;}

小结:set中的删除操作是不进行任何的错误检查的,比如定位器的是否合法等等,所以用的时候自己一定要注意。第二种删除是左闭右开[ l, r);

find()返回给定值的定位器,如果没找到则返回end()。

#include <iostream>#include <set>using namespace std;int main(){int a[] = {4, 6, 2 , 3};set<int> s(a,a + 4);set<int>::iterator iter;for(iter = s.begin();iter != s.end();iter++){cout << *iter << " " ;}cout << endl;if((iter = s.find(2)) != s.end())cout<<*iter<<endl;if((iter = s.find(1)) != s.end())cout<<*iter<<endl;return 0;}

insert(key_value);将key_value插入到set中 ,返回值是pair<set::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。

inset(first,second);将定位器first到second之间的元素插入到set中,返回值是void.

#include <iostream>#include <set>using namespace std;int main(){int a[] = {1, 4, 3, 7};set<int> s;set<int>::iterator iter;s.insert(a,a + 4);for(iter = s.begin() ; iter != s.end() ; ++iter){cout<<*iter<<" ";}cout<<endl;pair<set<int>::iterator,bool> pr;pr = s.insert(5);if(pr.second){cout<<*pr.first<<endl;}cout << " 插入数值之后的set中有:" << endl;for(iter = s.begin() ; iter != s.end() ; ++iter){cout<<*iter<<" ";}cout<<endl;return 0;}

lower_bound(key_value),返回第一个大于等于key_value的定位器

upper_bound(key_value),返回第一个大于key_value的定位器

#include <iostream>#include <set>#include<algorithm>using namespace std;int main(){set<int> s;for(int i = 1;i <= 5;i ++){int x;cin >> x;s.insert(x);}set<int>::iterator iter;for(iter = s.begin() ; iter != s.end() ; ++iter){cout << *iter << " ";}cout << endl;cout << "第一个大于等于 2 的值是: ";cout<<*s.lower_bound(2)<<endl;cout << "第一个大于等于 3 的值是: ";cout<<*s.lower_bound(3)<<endl;cout << "第一个大于 3 的值是: ";cout<<*s.upper_bound(3)<<endl;int a[5];for(int i=0;i<5;i++){cin>>a[i];}int p=upper_bound(a,a+5,3)-a;cout<<p<<endl;cout<<a[p];return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。