STL容器之set容器

STL-set

Posted by Zhihao on 2020-11-25

The First Title Picture

基础

简介:

所有元素都会在插入时自动被排序

本质:

set/multiset属于关联式容器,底层结构是用二叉树实现。

set和multiset区别

set不允许容器中有重复的元素;

multiset允许容器中有重复的元素 。

代码

Talk is cheap, show me the code.

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
#include<iostream>
using namespace std;
#include<set>

void printSet(const set<int>& ss)
{
for (set<int>::const_iterator it = ss.begin(); it != ss.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}

void printMultiset(const multiset<int>& ss)
{
for (multiset<int>::const_iterator it = ss.begin(); it != ss.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}

/*
构造:
set<T> st; //默认构造函数:
set(const set &st); //拷贝构造函数
赋值:
set& operator=(const set &st); //重载等号操作符
*/

void test01()
{
set<int> s1;
s1.insert(10);
s1.insert(20);
s1.insert(30);
s1.insert(40);
printSet(s1);

set<int> s2(s1);
printSet(s2);

set<int> s3;
s3 = s2;
printSet(s3);

}

/*
大小和交换函数原型:
size(); //返回容器中元素的数目
empty(); //判断容器是否为空
swap(st); //交换两个集合容器
*/

void test02()
{
set<int> s1;
s1.insert(10);
s1.insert(20);
s1.insert(30);
s1.insert(40);
printSet(s1);

if (s1.empty())
{
cout << "Empty" << endl;
}
else
{
cout << "Size: " << s1.size() << endl;
}

set<int> s2;
s2.insert(100);
cout << "交换前:" << endl;
printSet(s1);
printSet(s2);
s1.swap(s2);
cout << "交换后" << endl;
printSet(s1);
printSet(s2);
}

/*
插入和删除函数原型:
insert(elem); //在容器中插入元素。
clear(); //清除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem); //删除容器中值为elem的元素。
*/

void test03()
{
multiset<int> s1;
s1.insert(10);
s1.insert(20);
s1.insert(30);
s1.insert(40);
s1.insert(40);
s1.insert(40);
s1.insert(40);
printMultiset(s1);

s1.erase(s1.begin());
printMultiset(s1);

s1.erase(40);
printMultiset(s1);

s1.erase(s1.begin(), s1.end());
printMultiset(s1);

}

/*
查找和统计函数原型:
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key); //统计key的元素个数
*/

void test04()
{
multiset<int> s1;
s1.insert(10);
s1.insert(20);
s1.insert(30);
s1.insert(40);
s1.insert(40);
s1.insert(40);
s1.insert(40);
printMultiset(s1);

multiset<int>::iterator pp = s1.find(20);
if (pp != s1.end())
{
cout << "Find It: " << *pp << endl;
}
else
{
cout << "No this element" << endl;
}

cout << s1.count(40) << endl;

}


/*
set和multiset区别:
set不可以插入重复数据,而multiset可以
set插入数据的同时会返回插入结果,表示插入是否成功
multiset不会检测数据,因此可以插入重复数据
*/

void test05()
{
set<int> s1;
pair<set<int>::iterator, bool> ret = s1.insert(10);
if (ret.second)
{
cout << "Insert OK" << endl;
}
else
{
cout << "Failed!" << endl;
}

ret = s1.insert(10);
if (ret.second)
{
cout << "Insert OK" << endl;
}
else
{
cout << "Failed!" << endl;
}

}

/*
pair对组创建
功能描述:
成对出现的数据,利用对组可以返回两个数据
两种创建方式:
pair<type, type> p ( value1, value2 );
pair<type, type> p = make_pair( value1, value2 );
*/

void test06()
{
pair<string, int> pp1("zhangsan", 20);
pair<string, int> pp2 = make_pair("lisi", 23);
cout << pp1.first << " " << pp1.second << endl;
cout << pp2.first << " " << pp2.second << endl;
}


/*
set容器排序:
set容器默认排序规则为从小到大,掌握如何改变排序规则
主要技术点:
利用仿函数,可以改变排序规则
*/

class Person
{
public:
Person(string name, int age)
{
this->name = name;
this->age = age;
}

string name;
int age;
};

class compareP
{
public:
bool operator()(const Person& p1, const Person& p2)const //VS2019需要在这个后面加一个const
{
return p1.age > p2.age;
}
};

void test07()
{
set<Person, compareP> s;

Person p1("刘备", 23);
Person p2("关羽", 27);
Person p3("张飞", 25);
Person p4("赵云", 21);

s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);

for (set<Person, compareP>::iterator it = s.begin(); it != s.end(); it++)
{
cout << (*it).name << " " << (*it).age << endl;
}
}

int main()
{
test07();
system("pause");
return 0;
}

...

...

00:00
00:00