深入理解集合set:从基础概念到程序应用

《挑战程序设计竞赛》巫泽俊 主译
《算法竞赛入门经典》刘汝佳 著
一、集合set是什么?应用在哪?
映射也是一个常用的容器。在数学中,映射具有特定的性质和作用。
在程序设计里,我们牢牢抓住集合的互异性,也就是说任意一个元素都不会在集合中多次出现。
C++丢弃了集合的无序性。为了实际应用便捷,在 STL 库中,set 集合创建并插入元素后,会自动按照从小到大的顺序进行排列。
因此,这个容器常用于在一堆包含重复的数或字符串等数据中,把所有不同的数据筛选出来。
下面通过一个程序来熟悉set的各种基本用法:
二、set使用
这里列举一些常用的功能和方法,包括创建(可以是正序或倒序)、插入、使用迭代器、进行输出以及删除。
这里要特别提及一下。如果对所谓的迭代器不好理解,那么可以将其看作是 C 语言的指针,这个指针指向集合中的每一个元素。并且通过这种指向元素的方式,也就是通过“迭代器”的方式,能够得到元素的值。
通过一个程序了解所有常用方法:
#include
#include
#include
using namespace std;
//声明string类型从小到大排列的集合
set<string> s1;
//声明int型从大到小排列的集合
set<int,greater<int> > s2; //后面一定要空一格!
int main()
{
//向集合中插入元素
s1.insert("aaa");
s1.insert("ccc");
s1.insert("bbb");
s1.insert("aaa");//该语句等效于没有作用
//.count()方法只可能输出0或1,因为集合有互异性
cout<<s1.count("aaa");//1
//创建一个迭代器
set<string>::iterator it1;
//查找元素
it1=s1.find("aaa");
//单独输出某一个元素的方式
cout<<*it1<<endl;//迭代器类似于指针,读出内容时需要前面加*
//输出所有元素
for(it1=s1.begin();it1!=s1.end();it1++){
cout<<*it1<<" ";
}//aaa bbb ccc,按字典顺序输出
cout<<endl;//换行
s2.insert(1);
s2.insert(3);
s2.insert(2);
set<int>::iterator it2;
for(it2=s2.begin();it2!=s2.end();it2++){
cout<<*it2<<" ";
} //3 2 1
cout<<endl;
//删除元素
s2.erase(2);
for(it2=s2.begin();it2!=s2.end();it2++){
cout<<*it2<<" ";
}//3 1
return 0;
}
完整运行结果: