集合元素既充当存储的数据,又充当数据的关键码,集合更像一个有序链表,元素默认升序存储。
一、集合set的定义
1、定义一个空的集合,自动按照升序排序:set<int> myset;
2、定义一个空的集合,按照降序排序,有两种形式,可能不同的编译器会支持不同形式
形式1,模板含有多个参数(vs2010中调试通过):set<int,greater<int>> myset;
形式2,构造函数含有多个参数的形式:set<int> myset(greate<int>());
4、定义一个集合,一其他集合的迭代器进行初始化:set<int> myset(elseset.begin(),elseset.end());
二、set和multiset的容量、搜寻和统计
1、容量
获取容器容量:myset.size();
判断容器是否为空:myset.empty();
返回容器的最大容量:myset.max_size();
2、统计
统计键值为key的元素个数:myset.count(key);
3、查找
返回键值为key的元素的位置,函数的返回值为迭代器类型:myset.find(key);
返回容器中大于等于键值key的元素的迭代器:myset.lower_bounder(key);
返回容器中大于键值key的元素的迭代器:myset.upper_bound(key);
返回容器中键值大于等于键值key的元素的迭代器和键值大于键值key的元素的迭代器组成的pair:myset.equal_range(key);
三、set和multiset的迭代器相关函数和赋值函数
1、赋值操作:myset.elseset;
2、交换:myset.swap(elseset);
3、迭代器
set中的元素对于迭代器是常量,不可变的,因此不能使用标准库算法remove()等操作set
正向迭代器:myset.begin()/myset.end();
反向迭代器:myset.rbegin()/myset.rend();
四、set和multiset的插入和删除
1、插入
myset.insert(key);返回值为pair<iterator,bool>类型,第一元素表示插入key的迭代器,第二个元素表示是否插入成功
2、删除
myset.erase(iterator...);参数为迭代器或者迭代器的范围,返回所删除元素的迭代器
myset.erase(key);参数为键值,返回值为删除元素的个数
3、清空全部元素
myset.clear();
五、set和mutiset的比较运算符
1、键值比较
key_comp(),返回值为key_compare类型,用来判断set是正序排列还是逆序排列,如下源代码:
2、实值比较
value_comp(),返回值为value_compare()类型,同上例类似。
一、集合set的定义
1、定义一个空的集合,自动按照升序排序:set<int> myset;
2、定义一个空的集合,按照降序排序,有两种形式,可能不同的编译器会支持不同形式
形式1,模板含有多个参数(vs2010中调试通过):set<int,greater<int>> myset;
形式2,构造函数含有多个参数的形式:set<int> myset(greate<int>());
源代码如下:
#include "stdafx.h"
#include "set"
#include "iostream"
using namespace std;
void Output(set<int>& s)
{
set<int>::iterator it;
for (it=s.begin();it!=s.end();it++)
{
cout<<" "<<*it<<" ";
}
cout<<endl;
}
void OutputM(multiset<int>& ms)
{
multiset<int>::iterator it;
for (it=ms.begin();it!=ms.end();it++)
{
cout<<" "<<*it<<" ";
}
cout<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
set<int> s1;//自?动?按2照?升y序?排?序?
s1.insert(10);
s1.insert(15);
s1.insert(25);
s1.insert(20);
Output(s1);
set<int,greater<int>> s2;//包?含?谓?词阦reater<int>(),?自?动?按2照?降?序?排?序?
s2.insert(10);
s2.insert(15);
s2.insert(25);
s2.insert(20);
//Output(s2);
set<int> s3(s1);//以?其?他?集?合?进?行D初?始?化?
Output(s3);
set<int> s4(s1.begin(),s1.end());
Output(s4);
system("pause");
return 0;
}
3、定义一个集合,以其他集合进行初始化:set<int> myset(elseset);
4、定义一个集合,一其他集合的迭代器进行初始化:set<int> myset(elseset.begin(),elseset.end());
二、set和multiset的容量、搜寻和统计
1、容量
获取容器容量:myset.size();
判断容器是否为空:myset.empty();
返回容器的最大容量:myset.max_size();
2、统计
统计键值为key的元素个数:myset.count(key);
3、查找
返回键值为key的元素的位置,函数的返回值为迭代器类型:myset.find(key);
返回容器中大于等于键值key的元素的迭代器:myset.lower_bounder(key);
返回容器中大于键值key的元素的迭代器:myset.upper_bound(key);
返回容器中键值大于等于键值key的元素的迭代器和键值大于键值key的元素的迭代器组成的pair:myset.equal_range(key);
三、set和multiset的迭代器相关函数和赋值函数
1、赋值操作:myset.elseset;
2、交换:myset.swap(elseset);
3、迭代器
set中的元素对于迭代器是常量,不可变的,因此不能使用标准库算法remove()等操作set
正向迭代器:myset.begin()/myset.end();
反向迭代器:myset.rbegin()/myset.rend();
四、set和multiset的插入和删除
1、插入
myset.insert(key);返回值为pair<iterator,bool>类型,第一元素表示插入key的迭代器,第二个元素表示是否插入成功
2、删除
myset.erase(iterator...);参数为迭代器或者迭代器的范围,返回所删除元素的迭代器
myset.erase(key);参数为键值,返回值为删除元素的个数
3、清空全部元素
myset.clear();
五、set和mutiset的比较运算符
1、键值比较
key_comp(),返回值为key_compare类型,用来判断set是正序排列还是逆序排列,如下源代码:
#include "stdafx.h"
#include "set"
#include "iostream"
#include "algorithm"
#include "vector"
using namespace std;
void print(const int& ele)
{
cout<<ele<<" ";
}
int _tmain(int argc, _TCHAR* argv[])
{
typedef set<int> SET;
typedef multiset<int,greater<int>> MSET;
SET s1;
MSET s2;
s1.insert(10);
s1.insert(15);
s1.insert(21);
s1.insert(17);
s2.insert(11);
s2.insert(16);
s2.insert(20);
s2.insert(18);
s2.insert(20);
cout<<"SET s1:"<<endl;
for_each(s1.begin(),s1.end(),print);
cout<<endl;
cout<<"MSET s2:"<<endl;
for_each(s2.begin(),s2.end(),print);
cout<<endl;
set<int>::key_compare kcm=s1.key_comp();
if(kcm(2,3)==true)
{
cout<<"s1正y序?排?列D"<<endl;
}
else
{
cout<<"s1逆?序?排?列D"<<endl;
}
multiset<int,greater<int>>::key_compare kgcm=s2.key_comp();
if(kgcm(2,3)==true)
{
cout<<"s2正y序?排?列D"<<endl;
}
else
{
cout<<"s2逆?序?排?列D"<<endl;
}
system("pause");
return 0;
}
2、实值比较
value_comp(),返回值为value_compare()类型,同上例类似。