STL学习之九:set和multiset用法示例

来源:互联网 发布:录屏软件cs6 编辑:程序博客网 时间:2024/06/05 18:20

本文介绍STL中的集合set和multiset的用法示例。下面是有关知识点:

 1. set 是一个集合容器。其中所包含的元素时唯一的,集合中的元素按一定顺序排列;
 2. set 采用红黑树变体的数据结构实现,红黑树属于平衡和二叉树,比vector快;
 3. set 不可以直接存取元素;
 4. set 和 multiset 的区别: set支持唯一键值,每个元素只能出现一次,而multiset 同一值能出现多次;
 5. 不可以直接修改set 和 multiset容器中的元素值,因为该容器自动排序;
 6. 若想修改一个元素的值,必须先删除原有元素,再插入新的元素;
 7. set 默认情况下排序是 从小到大;
 8. 对于复杂的数据类型的处理方法。

下面是示例代码:

#define  _CRT_SECURE_NO_WARNINGS#include "iostream"using namespace std;#include "set"void main81(){set<int> s1;for (int i=0;i<5;i++)// set 默认情况下是 从小到大{int tmp = rand();s1.insert(tmp);}// 插入元素 重复的 组后只能插入一个s1.insert(100);s1.insert(100);s1.insert(100);for (set<int>::iterator it = s1.begin();it != s1.end();it++){cout <<*it << " ";}cout << endl;// 删除集合while(!s1.empty()){set<int>::iterator it = s1.begin();cout << *it << " ";s1.erase(s1.begin());}cout << endl;}void main82()//从大到小排序{set<int> s1;// set 默认情况下是 从小到大set<int,less<int>> s2;set<int,greater<int>> s3;//从大到小for (int i=0;i<5;i++){int tmp = rand();s3.insert(tmp);}for (set<int,greater<int>>::iterator it = s3.begin();it != s3.end();it++){cout <<*it << " ";}cout << endl;}// 对于复杂的数据类型 ==> 自定义类型的比较===》仿函数 函数对象class Student{public:Student(char *name,int age){strcpy(this->name,name);this->age = age;}public:char name[64];int age;protected:private:};// 不只是按名字还是按age排序===》仿函数 struct FuncStudent{bool operator()(const Student &left,const Student &right){if (left.age < right.age)// 如果左边的小 就返回真 从小到大按age排序{return true;}else{return false;}}};void main83(){Student s1("s1",31);Student s2("s2",22);Student s3("s3",44);Student s4("s4",11);set<Student,FuncStudent> set1;set1.insert(s1);set1.insert(s2);set1.insert(s3);set1.insert(s4);for (set<Student,FuncStudent>::iterator it=set1.begin();it != set1.end();it++){cout << it->name<< "\t" << it->age << endl;}}// 如何判断set1.insert函数的返回值 //仿函数的用法  typedef pair<iterator,bool> _Pairib; 检测再插入相同值时是否判断错误void main84(){Student s1("s1",31);Student s2("s2",22);Student s3("s3",44);Student s4("s4",11);Student s5("s5",31);set<Student,FuncStudent> set1;pair<set<Student,FuncStudent>::iterator,bool> pair1 = set1.insert(s1);if (pair1.second == true){cout <<"插入s1成功!" <<endl;}else{cout <<"插入s1失败!" <<endl;}set1.insert(s2);pair<set<Student,FuncStudent>::iterator,bool> pair5 = set1.insert(s5);if (pair5.second == true){cout <<"插入s5成功!" <<endl;}else{cout <<"插入s5失败!" <<endl;}set1.insert(s4);}void main85(){set<int> s1;// set 默认情况下是 从小到大for (int i=0;i<5;i++){s1.insert(i+1);}for (set<int>::iterator it = s1.begin();it != s1.end();it++){cout <<*it << " ";}cout << endl;set<int>::iterator it0 = s1.find(5);cout << *it0 <<endl;int num1 = s1.count(5);cout << num1 << endl;set<int>::iterator it1 = s1.lower_bound(5);// 大于等于5的元素的迭代器的位置cout <<*it1<< " " <<endl;set<int>::iterator it2 = s1.lower_bound(5);// 大于5的元素的迭代器的位置cout <<*it2 << " "<<endl;pair<set<int>::iterator,set<int>::iterator> mypair1 = s1.equal_range(5);//等于大于位置返回set<int>::iterator it3 = mypair1.first;cout << "it3:" << *it3 << endl;//5set<int>::iterator it4 = mypair1.second;cout << "it3:" << *it4 << endl;//6s1.erase(5);pair<set<int>::iterator,set<int>::iterator> mypair2 = s1.equal_range(5);//等于大于位置返回set<int>::iterator it5 = mypair2.first;cout << "it3:" << *it5 << endl;//6set<int>::iterator it6 = mypair2.second;cout << "it3:" << *it6 << endl;//6}void main(){//main81();//main82();//main83();//main84();main85();cout << "hello..."<< endl;system("pause");}

下面是multiset的用法:

void main86(){multiset<int> set1;int tmp = 0;printf("请输入集合值:");scanf("%d",tmp);while(tmp != 0){set1.insert(tmp);printf("请输入集合值:");scanf("%d",tmp);}//遍历for (multiset<int>::iterator it=set1.begin();it != set1.end();it++){cout << *it << " ";}cout << endl;while(!set1.empty()){multiset<int>::iterator it = set1.begin();cout << *it << " ";set1.erase(it);}}void main(){//main81();//main82();//main83();//main84();//main85();main86();cout << "hello..."<< endl;system("pause");}

原创粉丝点击