STL 集合(set)详解

        一个集合(set)是一个容器,其中所包含的元素的值是唯一的。集合中的元素按一定的顺序排列,并被作为集合中的实例。set中不会包含重复的元素。

       为了实现集合的快速运算,set内部数据的组织是一棵红黑树(一种非严格意义上的平衡树),这棵树具有对数据自动排序的功能,所以在set内部所有的数据都是有序的,即要求set中的元素必须是可排序的。如果是自定义的类型,那在定义类型的同时必须给出运算符"<"的定义。


1.set的构造函数

定义一个元素为整数的集合,可以用:

set<int> intSet;


2.数据的基本操作

  • 插入元素1:intSet.insert(1);
  • 删除元素1(如果存在):intSet.erase(1);
  • 判断元素1是否属于集合:if (intSet.find(1) == intSet.end()) { //...  ; }
  • 返回集合元素的个数:intSet.size();
  • 将集合清为空集:intSet.clear();


对集合数据添加查找与删除举个例子:

// STL 集合(set)
#include <iostream>
#include <set>
using namespace std;

int main()
{
	set<int> intSet;           //定义set对象
	set<int>::iterator iter;   //迭代器
	
	for (int i =0; i < 10; ++i)
		intSet.insert(i);      //集合A中是0~9
	
	if (intSet.find(1) == intSet.end()) // 查找1
		cout<<"Not Find "<<1<<endl;
	else
		cout<<"Find Value "<<1<<endl;
		
	intSet.erase(1);           //删除1
	if (intSet.find(1) == intSet.end()) 
		cout<<"Not Find "<<1<<endl;
	else
		cout<<"Find Value "<<1<<endl;
		
	return 0;
} 
输出结果:

Find Value 1

Not Find 1


3.集合的算法

STL中的算法包含在<algorithm>头文件中,集合的算法也包含在该头文件中。

  • 集合的并:set_union;
  • 集合的交:set_intersection;
  • 集合的差:set_difference;

下面通过一个C++的例子说明集合的各种操作:

// STL 集合算法(set)
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;

int main()
{
	set<int> A,B,C;    //定义set对象
	set<int>::iterator iter;   //迭代器
	
	for (int i = 0; i < 10; ++i)
	{
		A.insert(i);         //集合A中是0~9
		B.insert(2*i+1);     //集合B中都是奇数1~19 
	} 
	//集合A 
	for (iter = A.begin(); iter != A.end(); ++iter)
		cout<<*iter<<" ";
	cout<<endl;
	 
	//集合B 
	for (iter = B.begin(); iter != B.end(); ++iter)
		cout<<*iter<<" ";
	cout<<endl;
	
	//集合的并
	set_union(A.begin(), A.end(),B.begin(),B.end(), insert_iterator<set<int> >(C,C.begin()));
	for (iter = C.begin(); iter != C.end(); ++iter)
		cout<<*iter<<" ";
	cout<<endl;
	
	//集合的交
	C.clear();          //清空集合
	set_intersection(A.begin(), A.end(), B.begin(), B.end(), insert_iterator<set<int> >(C,C.begin()));
	for (iter = C.begin(); iter != C.end(); ++iter)
		cout<<*iter<<" ";
	cout<<endl;
	
	//集合的差
	C.clear();          //清空集合
	set_difference(A.begin(), A.end(), B.begin(), B.end(), insert_iterator<set<int> >(C,C.begin()));
	for (iter = C.begin(); iter != C.end(); ++iter)
		cout<<*iter<<" ";
	cout<<endl;
	
	return 0;
} 
输出结果:

0 1 2 3 4 5 6 7 8 9

1 3 5 7 9 11 13 15 17 19

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

1 3 5 7 9

0 2 4 6 8


ps:

insert_iterator::insert_iterator                //普通插入器  (复制粘贴自MSDN)
explicit insert_iterator(Cont& x, Cont::iterator it);  
The constructor initializes container with x, and iter with it.


STL 向量(vertor)详解:http://blog.csdn.net/qingdujun/article/details/17468181

STL 列表(list)详解:http://blog.csdn.net/qingdujun/article/details/17483185

STL 栈适配器(stack)详解:http://blog.csdn.net/qingdujun/article/details/17483407

STL 队列适配器(queue)详解:http://blog.csdn.net/qingdujun/article/details/17498707

STL 串类型(string)详解:http://blog.csdn.net/qingdujun/article/details/17498795

STL 多维数组(vector<vector<> >)详解:http://blog.csdn.net/qingdujun/article/details/17499871


转载请保留原文地址:http://blog.csdn.net/qingdujun/article/details/17501875


你可能感兴趣的:(STL 集合(set)详解)