stl基础 set集合
来源:互联网 发布:做一个java web项目 编辑:程序博客网 时间:2024/06/10 13:43
#include <string> #include <set> #include <conio.h> #include<iostream> using namespace std; /* set和multiset的内部结构通常是由平衡二叉树来实现的。当元素放入容器中时,会按照一定的排序法则自动排序,默认是按照less<>排序规则来排序。这种自动排序的特性加速了元素查找的过程,但是也带来了一个问题,不可以直接修改set或multiset容器中的元素值,因为这样就可能违反了元素自动排序的规则。如果你希望修改一个元素的值,必须先删除原有的元素,再插入新的元素。 一个集合(set)是一个容器,它其中的所包含的元素的值是唯一的。集合多集的区别是:set支持唯一的键值,set中的值都是特定的,而且只出现一次;而multiset中可以出现副本键,同一值可以出现多次。 */ //定义及初始化;没有返回值,或void void test0() { set<int> f; int myint[]={23,3,6,0}; set<int>se(myint,myint+4);//初始化[beg,end) set<int>th(se.begin(),se.end());//初始化[beg,end),与上面雷同 set<int>fo(se);//拷贝构造函数 } //增加删除元素;返回值是void,除erase()的返回值是iterator外 void test1() { //insert:1.直接插入一个数据 2.在iterator位置上插入一个数据 3.插入[beg,end)一段数据 set<int> myset; set<int>::iterator it; for (int i=0;i<5;i++) { myset.insert(i*10);//0 10 20 30 40 } std::pair<set<int>::iterator,bool>ret=myset.insert(20);//20已经存在了,所以ret.second为false if (!ret.second) { it=ret.first; cout<<*ret.first<<endl;//20 } myset.insert(it,24); int myint[]={5,10,15}; myset.insert(myint,myint+3);//插入的是[beg,end);10已经存在了,没有插入 for (it=myset.begin();it!=myset.end();it++) { cout<<*it<<" ";//0 5 10 15 20 24 30 40 } cout<<endl; //erase:1.删除一个数据 2.删除在iterator位置上的数据 3.删除在[beg,end)区间的数据 myset.erase(24);//0 5 10 15 20 30 40 it=myset.begin();//5 10 15 20 30 40 myset.erase(it); it=myset.find(20); myset.erase(it,myset.end());//5 10 15 for (it=myset.begin();it!=myset.end();it++) { cout<<*it<<" ";//5 10 15 } myset.clear();//删除所有元素 //set 的属性(通常是那些没有参数的函数):empty(),size() if (myset.empty())//判断集合是否为空 { cout<<"\nmyset is empty"<<endl; } if (myset.size()==0)//判断集合是否为空 { cout<<"myset size is 0"<<endl; } int myints[]={24,12,18,9}; set<int>first(myints,myints+2),second(myints+1,myints+4);//初始化是:[beg,end) first.swap(second); for (it=first.begin();it!=first.end();it++) { cout<<*it<<" ";//9 12 18 } cout<<endl; for (it=second.begin();it!=second.end();it++) { cout<<*it<<" ";//12 24 } cout<<endl; } //访问获取元素;返回值是Type T void test2() { int myint[]={75,23,65,42,13}; set<int> myset(myint,myint+5); cout<<*myset.find(65)<<endl;//65 //查找元素的位置iterator,若没有此元素,则返回myset.end()(最后一个元素的下一个位置) cout<<myset.count(65)<<endl;//1 查询元素的个数 } //返回迭代器;返回值是iterator,或reverse_iterator void test3() { int myint[]={75,23,65,42,13}; set<int> myset(myint,myint+5);//初始化:[beg,end) for (set<int>::iterator it=myset.begin();it!=myset.end();it++) { cout<<*it<<" ";//13 23 42 65 75 } cout<<"\nreverse myset:"<<endl; for (set<int>::reverse_iterator it=myset.rbegin();it!=myset.rend();it++) { cout<<*it<<" ";//75 65 42 23 13 } cout<<endl; } //其他 void test4() { int myint[]={75,23,65,42,13}; set<int> myset(myint,myint+5);//初始化:[beg,end) set<int>::key_compare com=myset.key_comp(); set<int>::iterator it=myset.begin(); int keyHighest=*myset.rbegin();//不能使用*myset.end() do { cout<<" "<<*it;//13 23 42 65 75 } while (com(*(it++),keyHighest)); cout<<endl; set<int>::value_compare val=myset.value_comp(); int valHighest=*myset.rbegin(); it=myset.begin(); do { cout<<" "<<*it;//13 23 42 65 75 } while (val(*(it++),valHighest)); cout<<endl; set<int>::iterator itlows,itups; itlows=myset.lower_bound(42); itups=myset.upper_bound(42); cout<<*itlows<<" "<<*itups<<endl;//42 65 std::pair<set<int>::iterator,set<int>::iterator> pa=myset.equal_range(42); cout<<"the lower bound point to:"<<*pa.first<<endl;//42 cout<<"the upper bound point to:"<<*pa.second<<endl;//65 //equal_range():返回pair(iterator,iterator),pair中的第一个迭代器是lower_bound()返回的迭代器,pair中的第二个迭代器是upper_bound()返回的迭代器,如果两个迭代器相等,则说明map中不存在这个关键字;就是在一个有序的数组中,取某个值Q[k]的前一个值Q[k-1]或是他本是Q[k]和后一个值Q[k+1] //lower_bound():返回是iterator,返回要查找关键字的下界(是一个迭代器),指向键值<=key的第一个元素 //upper_bound():返回是iterator,返回要查找关键字的上界(是一个迭代器),指向键值>key的第一个元素 } //遍历map中的数据 void test5() { //1.使用前向迭代器 //2.使用相反迭代器 int myint[]={75,23,65,42,13}; set<int> myset(myint,myint+5);//初始化:[beg,end) for (set<int>::iterator it=myset.begin();it!=myset.end();it++) { cout<<*it<<" ";//13 23 42 65 75 } cout<<"\nreverse myset:"<<endl; for (set<int>::reverse_iterator it=myset.rbegin();it!=myset.rend();it++) { cout<<*it<<" ";//75 65 42 23 13 } cout<<endl; } void Test(char h) { cout<<"press key===="<<h<<endl; switch(h) { case '0': test0();break; case '1': test1();break; case '2': test2();break; case '3': test3();break; case '4': test4();break; case '5': test5();break; case 27: case 'q':exit(0);break; default:cout<<"default "<<h<<endl;break; } } void main() { while(1) { Test(getch()); } }
0 0
- [STL基础]set集合
- stl基础 set集合
- stl之set集合容器应用基础
- STL:集合#include <set>
- STL 之 set 集合
- STL 集合(set)
- STL---Set(集合)
- STL set集合算法
- 【STL】集合set
- STL set集合容器
- C++ STL set集合
- STL之set集合容器
- STL之set集合容器
- STL之set集合容器
- STL之set集合容器
- STL之set集合容器
- c++STL Set集合容器
- STL之set集合容器
- CGI实现页面的动态生成
- 学习笔记,2014年8月19日,序列化一个实体,写入到本地,和读出。
- Android LayoutInflater原理分析,带你一步步深入了解View
- 设计 4 个 ( 可以是 n 个 ) 线程,其中两个线程每次对 j 增加 1 ,另外两个线程对 j 每次减少 1
- objective c工作原理
- stl基础 set集合
- 2014华为校招 重邮机试 2013.9.14 第一场
- java中关于Map的九大问题
- DNS原理、架构和配置详解
- Cocos2d-x内存管理研究<二>
- SVN
- poj 2378 Tree Cutting (树形dp)
- android4.0新控件Switch方法解析
- 决策树代码实现