文章转载自:STL中set的用法 - 邀月独斟 - 博客园
set,顾名思义,就是数学上的集合——每个元素最多只出现一次,并且set中的元素已经从小到大排好序。
头文件:#include
常用操作:
begin() 返回set容器的第一个元素的地址
end() 返回set容器的最后一个元素地址
clear() 删除set容器中的所有的元素
empty() 判断set容器是否为空
max_size() 返回set容器可能包含的元素最大个数
size() 返回当前set容器中的元素个数
erase(it) 删除迭代器指针it处元素
insert(a) 插入某个元素
样例如下:
<span style="color:#000000"><span style="background-color:#f6f8fa"><code><span style="color:#009900 !important">#include <iostream></span>
<span style="color:#009900 !important">#include <set></span>
<span style="color:#000088 !important">using</span> <span style="color:#000088 !important">namespace</span> <span style="color:#4f4f4f !important">std</span>;
<span style="color:#000088 !important">int</span> main()
{
<span style="color:#4f4f4f !important">set</span><<span style="color:#000088 !important">int</span>> s;
s.insert(<span style="color:#006666 !important">1</span>);
s.insert(<span style="color:#006666 !important">2</span>);
s.insert(<span style="color:#006666 !important">3</span>);
s.insert(<span style="color:#006666 !important">1</span>);
<span style="color:#4f4f4f !important">cout</span><<<span style="color:#009900 !important">"set 的 size 值为 :"</span><<s.size()<<endl;
<span style="color:#4f4f4f !important">cout</span><<<span style="color:#009900 !important">"set 的 maxsize的值为 :"</span><<s.max_size()<<endl;
<span style="color:#4f4f4f !important">cout</span><<<span style="color:#009900 !important">"set 中的第一个元素是 :"</span><<*s.begin()<<endl;
<span style="color:#4f4f4f !important">cout</span><<<span style="color:#009900 !important">"set 中的最后一个元素是:"</span><<*s.end()<<endl;
s.clear();
<span style="color:#000088 !important">if</span>(s.empty())
{
<span style="color:#4f4f4f !important">cout</span><<<span style="color:#009900 !important">"set 为空 !!!"</span><<endl;
}
<span style="color:#4f4f4f !important">cout</span><<<span style="color:#009900 !important">"set 的 size 值为 :"</span><<s.size()<<endl;
<span style="color:#4f4f4f !important">cout</span><<<span style="color:#009900 !important">"set 的 maxsize的值为 :"</span><<s.max_size()<<endl;
<span style="color:#000088 !important">return</span> <span style="color:#006666 !important">0</span>;
}</code></span></span>
- 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
还有两个功能类似的函数:count()和find()
1.count() :用来查找set中某个元素出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
2.find(): 用来查找set中某个元素出现的位置。如果找到,就返回这个元素的迭代器,如果这个元素不存在,则返回 s.end() 。 (最后一个元素的下一个位置,s为set的变量名)
set的遍历
需要用到迭代器,具体的方法见下面的代码:
<span style="color:#000000"><span style="background-color:#f6f8fa"><code><span style="color:#009900 !important">##include <iostream></span>
<span style="color:#009900 !important">#include<set></span>
<span style="color:#000088 !important">using</span> <span style="color:#000088 !important">namespace</span> <span style="color:#4f4f4f !important">std</span>;
<span style="color:#000088 !important">int</span> main()
{
<span style="color:#4f4f4f !important">set</span><<span style="color:#000088 !important">int</span>> s; <span style="color:#880000 !important"><em>//创建一个int类型的set</em></span>
s.insert(<span style="color:#006666 !important">10</span>); <span style="color:#880000 !important"><em>//插入数据</em></span>
s.insert(<span style="color:#006666 !important">30</span>);
s.insert(<span style="color:#006666 !important">20</span>);
s.insert(<span style="color:#006666 !important">40</span>);
<span style="color:#880000 !important"><em>//遍历数据,用迭代器遍历数据</em></span>
<span style="color:#000088 !important">for</span> (<span style="color:#4f4f4f !important">set</span><<span style="color:#000088 !important">int</span>>::iterator it = s.begin(); it != s.end(); ++it)
{
<span style="color:#4f4f4f !important">cout</span> << *it << endl;
}
<span style="color:#880000 !important"><em>//这里用到了set中的元素已经从小到大排好序的性质</em></span>
<span style="color:#000088 !important">return</span> <span style="color:#006666 !important">0</span>;
}</code></span></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
最后,不得不提的就是结构体类型(struct )的set ,使用时必须要重载 ‘<’ 运算符
<span style="color:#000000"><span style="background-color:#f6f8fa"><code><span style="color:#009900 !important">#include<iostream></span>
<span style="color:#009900 !important">#include<set></span>
<span style="color:#009900 !important">#include<string></span>
<span style="color:#000088 !important">using</span> <span style="color:#000088 !important">namespace</span> <span style="color:#4f4f4f !important">std</span>;
<span style="color:#000088 !important">struct</span> Info
{
<span style="color:#4f4f4f !important">string</span> name;
<span style="color:#000088 !important">double</span> score;
<span style="color:#000088 !important">bool</span> <span style="color:#000088 !important">operator</span> < (<span style="color:#000088 !important">const</span> Info &a) <span style="color:#000088 !important">const</span> <span style="color:#880000 !important"><em>// 重载“<”操作符,自定义排序规则</em></span>
{
<span style="color:#880000 !important"><em>//按score由大到小排序。如果要由小到大排序,使用“>”即可。</em></span>
<span style="color:#000088 !important">return</span> a.score < score;
}
};
<span style="color:#000088 !important">int</span> main()
{
<span style="color:#4f4f4f !important">set</span><Info> s;
Info info;
<span style="color:#880000 !important"><em>//插入三个元素</em></span>
info.name = <span style="color:#009900 !important">"Jack"</span>;
info.score = <span style="color:#006666 !important">80</span>;
s.insert(info);
info.name = <span style="color:#009900 !important">"Tom"</span>;
info.score = <span style="color:#006666 !important">99</span>;
s.insert(info);
info.name = <span style="color:#009900 !important">"Steaven"</span>;
info.score = <span style="color:#006666 !important">60</span>;
s.insert(info);
<span style="color:#4f4f4f !important">set</span><Info>::iterator it;
<span style="color:#000088 !important">for</span>(it = s.begin(); it != s.end(); it++)
<span style="color:#4f4f4f !important">cout</span> << (*it).name << <span style="color:#009900 !important">" : "</span> << (*it).score << endl;
<span style="color:#000088 !important">return</span> <span style="color:#006666 !important">0</span>;
}
<span style="color:#880000 !important"><em>/*
运行结果:
Tom : 99
Jack : 80
Steaven : 60
*/</em></span></code></span></span>

被折叠的 条评论
为什么被折叠?



