您的位置:首页 > 其它

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

2018-03-05 16:52 495 查看
  关于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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: