网站建设 摄影服务,网站建设 司法公开的需要,企业网站优化分为,企业宣传网站建设图示set是关联容器。其键值就是实值#xff0c;实值就是键值#xff0c;不可以有重复#xff0c;所以我们不能通过set的迭代器来改变set的元素的值#xff0c;set拥有和list相同的特性#xff1a;当对他进行插入和删除操作的时候#xff0c;操作之前的迭代器依然有效。当然删… set是关联容器。其键值就是实值实值就是键值不可以有重复所以我们不能通过set的迭代器来改变set的元素的值set拥有和list相同的特性当对他进行插入和删除操作的时候操作之前的迭代器依然有效。当然删除了的那个就没效了。set的底层结构是RB-tree所以是有序的。 stl中特别提供了一种针对set的操作的算法交集set_intersection并集set_union差集set_difference。对称差集set_symeetric_difference这些算法稍后会讲到。 一set模板类的声明。 template class key class Traitslesskey class Allocatorallocatorkey 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 2 3 4 5 std::setint::iterator it s.begin(); while(it!s.end()) { cout*itendl;//迭代器依次后移直到末尾。 } 如果要查找一个元素用find函数it s.find(3);这样it是指向3的那个元素的。可以通过rbeginrend来逆向遍历 1 2 3 4 5 std::setint::reverse_iterator it s.rbegin(); while(it!s.rend()) { cout*itendl; } 还有其他的一些操作在这就不一一列出了。 三set向量的使用实例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #include iostream #include string #include set #include algorithm #include iterator using namespace std; /* 联合容器将值与关键字联合在一起使用关键字来查找值 * 提供元素的快速访问插入元素不能指定位置容器自动处理插入位置 * STL 提供四种联合容器set、multiset、map、multimap * set、multiset 存储一种元素前者关键字不可重复后者关键字可以重复。 * map、multimap 存储一对元素键与值前者关键字不可重复后者关键字可以重复。 */ int main() { const int N 3; string s1[N] {xp,python,linux}; string s2[N] {python,php,perl}; setstring sa(s1, s1 N);// 声明一个集合sa元素为数组s1 setstring sb(s2, s2 N);// 声明一个集合sb元素为数组s2 setstring sc;// 声明一个空集合sc ostream_iteratorstring, char out (cout, ); copy(sa.begin(), sa.end(), out); cout -set sa endl; copy(sb.begin(), sb.end(), out); cout -set sb endl; set_union(sa.begin(), sa.end(), sb.begin(), sb.end(), out); cout -set_union() 并集 endl; set_intersection(sa.begin(), sa.end(), sb.begin(), sb.end(), out); cout -set_intersection() 交集 endl; set_difference(sa.begin(), sa.end(), sb.begin(), sb.end(), out); cout -set_difference() 集合的差 endl; set_difference(sb.begin(), sb.end(), sa.begin(), sa.end(), out); cout -set_difference() 集合的差 endl; set_union(sa.begin(), sa.end(), sb.begin(), sb.end(), insert_iteratorsetstring (sc, sc.begin() )); sc.insert(delphi); copy(sc.begin(), sc.end(), out); cout -set sc endl; copy(sc.lower_bound(perl), sc.upper_bound(python), out); cout -显示集合区间 endl; return 0; } 作者ACShiryu 出处http://www.cnblogs.com/ACShiryu/ 若非注明本博客文章均为原创版权归作者和博客园共有欢迎转载但必须保留此段声明且在文章页面明显位置给出原文链接否则保留追究法律责任的权利。 该文章也同步发布在我的新浪微博中-ACShiryus weibo欢迎收听。 转载于:https://www.cnblogs.com/xumaojun/p/8543082.html