033day(multiset的学习)

《2017年11月12日》【连续033天】

标题:multiset的学习;

内容:A.观看MOOC12.3,12.4;

B.(a).STL中的平衡二叉树数据结构:

在大量增加,删除数据的同时,还要进行大量数据的查找,为了减少复杂度,

我们使用“平衡二叉树”数据结构存放数据,在STL中,有四种“排序容器”:

multiset  set  multimap  map

(b).multiset:

multiset<T> st;

定义一个multiset变量st,st里面可存放T类型的数据,并且能自动排序。开始st为空;

排序规则:表达式“a<b”为true,则a排在b前面;

可用st.insert  st.find   st.erase  来添加,查找,删除元素;

迭代器:multiset<T>::iterator p;

p是迭代器,相当于指针,可指向multiset中的元素。访问multiset中的元素要通过迭代器。

multiset上的迭代器可 ++,--,可用!=和==比较,

但不可比大小,不可加减整数,不可相减;

st.begin() 返回值类型为multiset<T>::iterator,是指向st中头一个元素的迭代器

st.end() 是指向st中的最后一个元素后面的迭代器;

对迭代器++,--就是指向容器中下,上一个元素;

#include<set>
using namespace std;
int main()
{
multiset<int> st;
int a[10]={1,14,12,13,7,13,21,19,8,8};
for(int i=0;i<10;++i)
       st.insert(a[i]);      //插入的是a[i]的复制品
multiset<int>::iterator i;
for(i =st.begin();i !=st.end();++i)
       cout<<*i<<",";
cout<<endl;
i =st.find(22);   //查找22,返回值是迭代器
if(i ==st.end())  cout<<"not found"<<endl;  //
st.insert(22);
i =st.find(22);
if(i==st.end())
      cout<<"not found"<<endl;
else
      cout<<"found:"<<*i<<endl;
i =st.lower_bound(13);  //返回最靠后的迭代器 it,使得[begin(),it)中的元素,都在13前面
cout<<*i<<endl;
i=st.upper_bound(8);  //返回最靠前的迭代器it,使得[it,end())中的元素都在8后面 
cout<<*i<<endl;
st.erase(i);
for(i=st.begin();i !=st.end();++i) 
  cout<<*i<<" ";

自定义排序规则的multiset用法:

struct Rule{
bool operator()(const int &a,const int &b){
return (a%10)<(b%10);
}  //返回值为true则说明a必须排在b前面 
};
int main()
{
multiset<int,greater<int> >st;   //排序规则为从大到小 ,两个>间有空格 
int a[10]={1,14,12,13,7,13,21,19,8,8};
for(int i=0;i<10;++i)
   st.insert(a[i]);
multiset<int,greater<int> >::iterator i;
for(i=st.begin();i !=st.end();++i)
     cout<<*i<<",";
    cout<<endl;
multiset<int,Rule>st2;
for(int i=0;i<10;++i)
     st2.insert(a[i]);
multiset<int,Rule>::iterator p;
for(p =st2.begin();p!=st2.end();++p)
    cout<<*p<<" ";
cout<<endl;
p=st2.find(133);
cout<<*p<<endl;    //输出13,按照排序规则13“等于”133,详见032day;

明日计划:学习set;     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值