dedecms 把自己的网站添加进去,流量套餐网站,制作网页之前必须先建立什么,网络运营课程培训视频C Sets MultiSetsSTL Set介绍 集合(Set)是一种包含已排序对象的关联容器。多元集合(MultiSets)和集合(Sets)相像#xff0c;只不过支持重复对象,其用法与set基本相同。Set 又称集合#xff0c;实际上就是一组元素的集合#xff0c;但其中所包含的元素的值是唯一的 Sets MultiSetsSTL Set介绍 集合(Set)是一种包含已排序对象的关联容器。多元集合(MultiSets)和集合(Sets)相像只不过支持重复对象,其用法与set基本相同。Set 又称集合实际上就是一组元素的集合但其中所包含的元素的值是唯一的且是按一定顺序排列的集合中的每个元素被称作集合中的实例。因为其内部是通过链表的方式来组织所以在插入的时候比vector 快但在查找和末尾添加上比vector 慢。multiset 是多重集合其实现方式和set 是相似的只是它不要求集合中的元素是唯一的也就是说集合中的同一个元素可以出现多次。构造 explicit set(const Comparecompare()); 如setint,lessint set1; lessint是一个标准类用于形成升序排列函数对象。降序排列是用greaterint。 Templateclass InputIterator set(InputIterator, InputIterator,\ const Comparecompare()); 如setint ,lessint set2(vector1.begin(),vector1.end()); 通过指定某一预先定义的区间来初始化set对象的构造函数。 setconst setKey,Compare; 如setint ,lessint set3(set2); 方法1.begin() 返回指向第一个元素的迭代器2.clear() 清除所有元素3.count() 返回某个值元素的个数4.empty() 如果集合为空返回true5.end() 返回指向最后一个元素的迭代器6.equal_range() 返回第一个关键字的迭代器和关键字的迭代器语法pair iterator,iteratorequal_range( const key_type key );//key是用于排序的关键字Setint ctr;例如Pairsetint::iterator,setint::iterarotp;For(i0;i5;i) ctr.insert(i);Pctr.equal_range(2);那么*p.first2;*p.second3;7.erase() 删除集合中的元素语法:iterator erase( iterator i ); //删除i位置元素iterator erase( iterator start, iterator end );//删除从start开始到end(end为第一个不被删除的值)结束的元素size_type erase( const key_type key );//删除等于key值的所有元素返回被删除的元素的个数//前两个返回第一个不被删除的双向定位器,不存在返回末尾//第三个返回删除个数8.find() 返回一个指向被查找到元素的迭代器语法:iterator find( const key_type key );//查找等于key值的元素并返回指向该元素的迭代器;//如果没有找到,返回指向集合最后一个元素的迭代器9.get_allocator() 返回集合的分配器10.insert() 在集合中插入元素语法:iterator insert( iterator i, const TYPE val ); //在迭代器i前插入valvoid insert( input_iterator start, input_iterator end );//将迭代器start开始到endend不被插入结束返回内的元素插入到集合中pair insert( const TYPE val );//插入val元素返回指向该元素的迭代器和一个布尔值来说明val是否成功被插入//应该注意的是在集合(Sets中不能插入两个相同的元素)11.lower_bound() 返回指向大于或等于某值的第一个元素的迭代器语法:iterator lower_bound( const key_type key );//返回一个指向大于或者等于key值的第一个元素的迭代器12.key_comp() 返回一个用于元素间值比较的函数语法:key_compare key_comp();//返回一个用于元素间值比较的函数对象13.max_size() 返回集合能容纳的元素的最大限值14.rbegin() 返回指向集合中最后一个元素的反向迭代器示例Setint ctr;Setint::reverse_iterator rcp;For(rcpctr.rbegin();rcp!ctr.rend();rcp)Cout*rcp” ”;15.rend() 返回指向集合中第一个元素的反向迭代器16.size() 集合中元素的数目17.swap() 交换两个集合变量语法:void swap( set object ); //交换当前集合和object集合中的元素18.upper_bound() 返回大于某个值元素的迭代器语法:iterator upwer_bound( const key_type key );//返回一个指向大于key值的第一个元素的迭代器19.value_comp() 返回一个用于比较元素间的值的函数语法:iterator upper_bound( const key_type key );//返回一个用于比较元素间的值的函数对象20.Set集合的并交和差 set_union(a.begin(),a.end(),b.begin(),b.end(),insert_iteratorsetint (c,c.begin()));set_intersection(a.begin(),a.end(),b.begin(),b.end(),insert_iteratorsetint (c,c.begin()));set_difference(a.begin(),a.end(),b.begin(),b.end(),insert_iteratorsetint (c,c.begin()));以下转自
http://blog.csdn.net/wangji163163/article/details/3740948STL Set 交集 合集 差集 Set是关联容器。其键值就是实值实值就是键值不可以有重复所以我们不能通过set的迭代器来改变set的元素的值set拥有和list相同的特性当对他进行插入和删除操作的时候操作之前的迭代器依然有效。当然删除了的那个就没效了。Set的底层结构是RB-tree所以是有序的。 stl中特别提供了一种针对set的操作的算法交集set_intersection并集set_union差集set_difference。对称差集set_symeetric_difference这些算法稍后会讲到。 一set模板类的声明。 1 template 2 class Key, 3 class TraitslessKey, 4 class AllocatorallocatorKey 5 6 class set。 其中个参数的意义如下 key要放入set里的数据类型可以是任何类型的数据。 Traits这是一个仿函数关于仿函数是什么我后面的文章会讲到。提供了具有比较功能的仿函数来觉得元素在set里的排列的顺序这是一个可选的参数默认的是std::lesskey如果要自己提供这个参数那么必须要遵循此规则具有两个参数返回类型为bool。 Allocator:空间配置器这个参数是可选的默认的是std::allocatorkey. 二set里的基本操作 我们可以通过下面的方法来实例化一个set对象 std::setint s;那个s这个对象里面存贮的元素是从小到大排序的(因为用std::less作为比较工具。) 如果要想在s里面插入数据可以用inset函数set没用重载[]操作因为set本生的值和索引是相同的) s.insert(3);s.insert(5)..... 因为set是集合那么集合本身就要求是唯一性所以如果要像set里面插入数据和以前的数据有重合那么插入不成功。 可以通过下面的方法来遍历set里面的元素 1 std::setint::iterator it s.begin(); 2 while(it!s.end()) 3 { 4 cout*itendl;//迭代器依次后移直到末尾。 5 } 如果要查找一个元素用find函数it s.find(3);这样it是指向3的那个元素的。可以通过rbeginrend来逆向遍历 1 std::setint::reverse_iterator it s.rbegin(); 2 3 while(it!s.rend()) 4 5 {cout*itendl;} 还有其他的一些操作在这就不一一列出了。 三与set相关的一组算法 set_intersection() :这个函数是求两个集合的交集。下面是stl里的源代码 1 templateclass _InIt1, 2 class _InIt2, 3 class _OutIt inline 4 _OutIt set_intersection(_InIt1 _First1, _InIt1 _Last1, 5 _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest) 6 { // AND sets [_First1, _Last1) and [_First2, _Last2), using operator 7 for (; _First1 ! _Last1 _First2 ! _Last2; ) 8 if (*_First1 *_First2) 9 _First1; 10 else if (*_First2 *_First1) 11 _First2; 12 else 13 *_Dest *_First1, _First2; 14 return (_Dest); 15 } 这是个模板函数从上面的算法可以看出传进去的两个容器必须是有序的。_Dest指向输出的容器这个容器必须是预先分配好空间的否则会出错的,返回值指向保存结果的容器的尾端的下一个位置。eg. 1 set_union() :求两个集合的并集参数要求同上。 2 3 std::set_difference差集 4 5 set_symmetric_difference得到的结果是第一个迭代器相对于第二个的差集并上第二个相当于第一个的差集。代码 6 7 struct compare 8 { 9 bool operator ()(string s1,string s2) 10 { 11 return s1s2; 12 }///自定义一个仿函数 13 }; 14 int main() 15 { 16 typedef std::setstring,compare _SET; 17 _SET s; 18 s.insert(string(sfdsfd)); 19 s.insert(string(apple)); 20 s.insert(string(english)); 21 s.insert(string(dstd)); 22 couts1:endl; 23 std::setstring,compare::iterator it s.begin(); 24 while(it!s.end()) 25 cout*it ; 26 coutendls2:endl; 27 _SET s2; 28 s2.insert(string(abc)); 29 s2.insert(string(apple)); 30 s2.insert(string(english)); 31 it s2.begin(); 32 while(it!s2.end()) 33 cout*it ; 34 coutendlendl; 35 36 string str[10]; 37 string *end set_intersection(s.begin(),s.end(),s2.begin(),s2.end(),str,compare());//求交集返回值指向str最后一个元素的尾端 38 coutresult of set_intersection s1,s2:endl; 39 string *first str; 40 while(firstend) 41 cout *first ; 42 coutendlendlresult of set_union of s1,s2endl; 43 end std::set_union(s.begin(),s.end(),s2.begin(),s2.end(),str,compare());//并集 44 first str; 45 while(firstend) 46 cout *first ; 47 coutendlendlresult of set_difference of s2 relative to s1endl; 48 first str; 49 end std::set_difference(s.begin(),s.end(),s2.begin(),s2.end(),str,compare());//s2相对于s1的差集 50 while(firstend) 51 cout *first ; 52 coutendlendlresult of set_difference of s1 relative to s2endl; 53 first str; 54 end std::set_difference(s2.begin(),s2.end(),s.begin(),s.end(),str,compare());//s1相对于s2的差集 55 56 while(firstend) 57 cout *first ; 58 coutendlendl; 59 first str; 60 end std::set_symmetric_difference(s.begin(),s.end(),s2.begin(),s2.end(),str,compare());//上面两个差集的并集 61 while(firstend) 62 cout *first ; 63 coutendl; 64 } 65 66 setint s3 ; 67 setint::iterator iter s3.begin() ; 68 set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(s3,iter)); 69 copy(s3.begin(),s3.end(), ostream_iteratorint(cout, ));