1. set: 顾名思义,就是数学上的集合——每个元素最多只出现一次,并且set中的元素已经从小到大排好序。使用时需要加头文件set。和vector的区别是set可以去重。
成员函数有:
s.begin();返回set容器的第一个元素的地址
s.end();返回set容器的最后一个元素地址
s.clear();删除set容器中的所有的元素
s.empty();判断set容器是否为空
s.max_size();返回set容器可能包含的元素最大个数
s.size();返回当前set容器中的元素个数
s.erase(it);删除迭代器指针it处元素
s.insert(a);插入某个元素
用set实现集合并交差#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
int main()
{
set<int>x;
set<int>y;
set<int>z;
x.insert(1);
x.insert(2);
x.insert(3);
y.insert(2);
y.insert(3);
y.insert(5);
set<int>::iterator it;
cout<<"x的集合为:";
for(it=x.begin();it!=x.end();it++)
cout<<*it<<" ";
cout<<endl;
cout<<"y的集合为:";
for(it=y.begin();it!=y.end();it++)
cout<<*it<<" ";
cout<<endl;
set_union(x.begin(),x.end(),y.begin(),y.end(),inserter(z,z.begin()));
cout<<"并集:";
for(it=z.begin();it!=z.end();it++)
cout<<*it<<" ";
cout<<endl;
z.clear();
set_intersection(x.begin(),x.end(),y.begin(),y.end(),inserter(z,z.begin()));
cout<<"交集:";
for(it=z.begin();it!=z.end();it++)
cout<<*it<<" ";
cout<<endl;
z.clear();
set_difference(x.begin(),x.end(),y.begin(),y.end(),inserter(z,z.begin()));
cout<<"差集:";
for(it=z.begin();it!=z.end();it++)
cout<<*it<<" ";
cout<<endl;
return 0;
}
还有两个功能类似的函数:count()和find()
1.count() :用来查找set中某个元素出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
2.find(): 用来查找set中某个元素出现的位置。如果找到,就返回这个元素的迭代器,如果这个元素不存在,则返回 s.end() 。 (最后一个元素的下一个位置,s为set的变量名)
set的遍历
需要用到迭代器,具体的方法见下面的代码:
#include<iostream>
#include<set>
usingnamespacestd;
int main()
{
set<int>s; //创建一个int类型的set
s.insert(10); //插入数据
s.insert(30);
s.insert(20);
s.insert(40);
//遍历数据,用迭代器遍历数据
for (set<int>::iteratorit = s.begin(); it != s.end(); ++it)
{
cout <<*it << endl;
}
//这里用到了set中的元素已经从小到大排好序的性质
return0;
}
最后,不得不提的就是结构体类型(struct )的set ,使用时必须要重载 ‘<’ 运算符
#include<iostream>
#include<set>
#include<string>
usingnamespacestd;
struct Info
{
string name;
double score;
booloperator < (const Info&a) const// 重载“<”操作符,自定义排序规则
{
//按score由大到小排序。如果要由小到大排序,使用“>”即可。
return a.score< score;
}
};
int main()
{
set<Info> s;
Info info;
//插入三个元素
info.name = "Jack";
info.score = 80;
s.insert(info);
info.name = "Tom";
info.score = 99;
s.insert(info);
info.name = "Steaven";
info.score = 60;
s.insert(info);
set<Info>::iterator it;
for(it = s.begin(); it != s.end(); it++)
cout <<(*it).name << " : " << (*it).score << endl;
return0;
}
而 map:映射,关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力。
具体用法可参考下面这篇博客
map详解