set容器概念:
1.set容器属于集合容器,其元素值称为关键字。set中元素的关键字是唯一的。(multiset中元素的关键字可以不唯一。)
2.默认情况下会对元素按关键字自动进行升序排列
3.所以查找速度比较快,同时支持交、差和并等一些集合上的运算
4.如果需要集合中的元素允许重复,那么可以使用multiset。(multiset是多重集合容器)
5.由于set中没有相同关键字的元素,在向set中插入元素时,如果已经存在则不插入
6.multiset中允许存在两个相同关键字的元素,在删除操作时删除multiset中值等于elem的所有元素,若成功则返回删除个数,否则返回0。
set/multiset的成员函数如下:
begin()--返回指向第一个元素的迭代器
clear()--清除所有元素
count()--返回某个值元素的个数
empty()--如果集合为空,返回true
end()--返回指向最后一个元素的迭代器
equal_range()--返回集合中与给定值相等的上下限的两个迭代器
erase()--删除集合中的元素
find()--返回一个指向被查找到元素的迭代器
get_allocator()--返回集合的分配器
insert()--在集合中插入元素
lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
key_comp()--返回一个用于元素间值比较的函数
max_size()--返回集合能容纳的元素的最大限值
rbegin()--返回指向集合中最后一个元素的反向迭代器
rend()--返回指向集合中第一个元素的反向迭代器
size()--集合中元素的数目
swap()--交换两个集合变量
upper_bound()--返回大于某个值元素的迭代器
value_comp()--返回一个用于比较元素间的值的函数
set容器运用的简单例子:
题目:
有两个整数序列,分别为{3,2,4,8}、{1,2,4,5,3},设计一个算法求它们的公共元素,要求使用set的集合算法。
代码:
#include <stdio.h>
#include <set>
using namespace std;
// 传入s1,s2,s3参数;并定义set地址指针,指向交集s3的地址,使形参改变实参;取s1,s2的交集存于s3
void solve(set<int>s1, set<int>s2, set<int>&s3) // 不加 &不能改变 s3(&可指向s3地址,改变其值)
{
set<int>::iterator it1, it2; // 定义set容器迭代器 it
it1 = s1.begin(); // set容器迭代器指向对应地址
it2 = s2.begin(); // set容器迭代器指向对应地址
while(it1!=s1.end() && it2!=s2.end()){
if(*it1 == *it2){
s3.insert(*it1);
it1++;
it2++;
}
else if(*it1 < *it2)
it1++;
else
it2++;
}
}
// 输出集合中的元素(输出函数)
void dispset(set<int>s)
{
set<int>::iterator it;
for(it=s.begin(); it!=s.end(); it++){
printf("%d ", *it);
}
printf("\n");
}
int main()
{
int a[] = {3,2,4,8};
int n = sizeof(a)/sizeof(a[0]);//计算a数组长度
set<int>s1(a,a+n); //定义set容器s1,并用数组a[]的元素初始化
int b[] = {1,2,4,5,3};
int m = sizeof(b)/sizeof(b[0]);//计算b数组长度
set<int>s2(b,b+m); 定义set容器s2,并用数组b[]的元素初始化
set<int> s3;
solve(s1, s2, s3);
printf("运行结果如下: \n");
printf(" s1: ");
dispset(s1);
printf(" s2: ");
dispset(s2);
printf(" s3: ");
dispset(s3);
return 0;
}