multiset多重集合容器(常用的使用方法总结)

  关于C++STL中multiset集合容器的学习,看别人的代码一百遍,不如自己动手写一遍。
  multiset多重集合容器和set集合容器的使用方法大多相同,不同的是multiset多重集合容器允许重复的元素键值插入。

  1 #include <set>
  2 #include <string> 
  3 #include <iostream>
  4 using namespace std;
  5 
  6 struct myComp{
  7     bool operator () (const string &a,const string &b){
  8         if(a.compare(b) == 1)
  9             return 1;
 10         return 0;
 11     }
 12 }; 
 13 
 14 struct STUDENT{
 15     string name;
 16     double score;
 17     //重载"<"运算符,自定义排列规则 
 18     bool operator < (const STUDENT &a) const{
 19         return a.score<score;//由大到小。如果由小到大,则符号为> 
 20     } 
 21 }; 
 22 
 23 void print(multiset<string> ms);
 24 void rprint(multiset<string> ms);
 25 
 26 int main()
 27 {
 28     //多重集合的创建与插入 
 29     multiset<string> ms;
 30     ms.insert("abc");
 31     ms.insert("123");
 32     ms.insert("111");
 33     ms.insert("aaa");
 34     ms.insert("123");
 35     cout<<"中序正向遍历:\n";
 36     print(ms);
 37     cout<<"中序逆向遍历:\n";
 38     rprint(ms);
 39     /*运行结果
 40     中序正向遍历:
 41     111
 42     123
 43     123
 44     aaa
 45     abc
 46     中序逆向遍历:
 47     abc
 48     aaa
 49     123
 50     123
 51     111
 52     */
 53     
 54     //元素的查找
 55     /*同set集合容器一样,使用find()查找元素,如果找到返回钙元素的迭代器位置(如果该元素存在重复,则返回第
 56     一个重复元素的迭代器位置),否则,返回end()迭代器*/
 57     multiset<string>:: iterator it;
 58     it=ms.find("123");
 59     if(it != ms.end()) cout<<"找到键值为123的元素\n";
 60     it=ms.find("456");
 61     if(it == ms.end()) cout<<"没有找到键值为456的元素\n";
 62     /*运行结果
 63     找到键值为123的元素
 64     没有找到键值为456的元素
 65     */
 66     
 67     //多重集合元素的删除
 68     cout<<"删除前:\n";
 69     print(ms); 
 70     int n=ms.erase("123");//删除键值等于某个值得所有重复元素,并返回删除元素的个数
 71     cout<<"删除了"<<n<<"个元素\n";
 72     cout<<"删除后:\n";
 73     print(ms);
 74     /*运行结果
 75     删除前:
 76     111
 77     123
 78     123
 79     aaa
 80     abc
 81     删除了2个元素
 82     删除后:
 83     111
 84     aaa
 85     abc
 86     */ 
 87     
 88     ms.clear();
 89     if(ms.empty()) cout<<"清除后为:空\n";
 90     /*运行结果 
 91     清除后为:空
 92     */
 93     
 94     /*同样在使用insert()可以采用自定义比较函数,默认从小到大*/
 95     //当元素类型是基本数据类型时,采用在主函数前重载"()"操作符
 96     multiset<string,myComp> mss; 
 97     mss.insert("abc");
 98     mss.insert("123");
 99     mss.insert("111");
100     mss.insert("aaa");
101     mss.insert("123");
102     
103     multiset<string>::iterator it1;
104     for(it1= mss.begin(); it1 != mss.end(); it1 ++){
105         cout<<*it1<<endl;
106     }
107     /*运行结果 
108     abc
109     aaa
110     123
111     123
112     111
113     */
114     
115     //如果元素是结构体,可以将比较函数写在结构体内,见main函数之前的定义方法 
116     multiset<STUDENT> students;
117     STUDENT someone;
118     someone.name="Jack";
119     someone.score=80.5;
120     students.insert(someone);
121     
122     someone.name="Tomi";
123     someone.score=57.5;
124     students.insert(someone); 
125     
126     someone.name="Nacy";
127     someone.score=60.5;
128     students.insert(someone);
129     
130     someone.name="Nacy";
131     someone.score=60.5;
132     students.insert(someone);
133     
134     multiset<STUDENT>:: iterator it2;
135     for(it2 = students.begin(); it2 != students.end(); it2 ++){
136         cout<<(*it2).name<<":"<<(*it2).score<<endl;
137     }
138     /*运行结果 
139     Jack:80.5
140     Nacy:60.5
141     Nacy:60.5
142     Tomi:57.5
143     */
144     return 0;
145 }
146 
147 void print(multiset<string> ms)
148 {
149     multiset<string>:: iterator it;
150     for(it=ms.begin(); it != ms.end(); it ++){
151         cout<<*it<<endl;
152     }
153 }
154 
155 void rprint(multiset<string> ms)
156 {
157     multiset<string>::reverse_iterator rit;
158     for(rit=ms.rbegin(); rit != ms.rend(); rit++){
159         cout<<*rit<<endl;
160     }
161 }

 

posted @ 2018-03-05 16:52  Reqaw  阅读(1664)  评论(0编辑  收藏  举报