STL容器-关联式容器set/multiset

集合元素既充当存储的数据,又充当数据的关键码,集合更像一个有序链表,元素默认升序存储。
一、集合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()类型,同上例类似。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值