STL_multiset和STL_set--算法--笔记

STL_multiset

方法:multiset<T>st;

定义了一个multiset变量st,st里面可以存放T类型数据,并且能自动排序。开始st为空
排序规则:表达式"a<b"为true,则a排在b前面

可用的方法

目的 格式
添加元素 st.insert
查找元素 st.find
删除元素 st.erase
复杂度都是 log(n)

用法
multiset上的迭代器:multiset<T>::iterator p;

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

与指针的不同:

multiset上的迭代器可++,–,用!=和==比较,不可比大小,不可加减整数,不可相减
st.begin()返回值类型为multiset::iterator, 是指向st中的头一个元素的迭代器
st.end()返回值类型为multiest::iterator,
是指向st中的最后一个元素后面的迭代器
对迭代器++,其就指向容器中的下一个元素,–则令其指向上一个元素

#include<iostream>
#include<cstring>
#include<set>//使用multiset和set需要此头文件
using namespace std;
int main(){
 multiset<int>st;
 int a[10]={1,14,12,13,7,13,21,19,8,8};
 for(int j=0;j<10;++j){
 st.insert(a[j]);//插入的是a[i]的复制品
 multiset<int>::iterator i;//迭代器,类似于指针
 for(i=st.begin();i!=st.end();++i)
 cout<<*i<<" ,";
 cout<<endl;
 输出:1,7,8,8,12,13,13,14,19,21,
 i=st.find(22);//查找22,返回值是迭代器
 if(i==st.st.end())//找不到返回值为end()
 cout<<"not found"<<endl;
 st.insert(22);//插入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前面 复杂度log(n)
  cout<<*i<<endl;
  i=st.upper_bound(8);
 //返回最靠前的迭代器,使得[it,end())中的元素
 //都在8后面,复杂度log(n)
  cout<<*i<<endl;//1,7,8,8,12,12,12,14,19,21;
  st.erase(i);//删除迭代器i指向的元素,即12
  for(i=st.begin();i!=st.end();++i)
  cout<<*i<<",";
  return 0;
  输出:
  13
  12
  1,7,8,8,13,13,14,19,21,22
 }
}

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

#include<iostream>
#include<cstring>
#include<set>
using namespace std;
struct Rule1{
 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;
 //输出:21,19,14,13,13,12,8,8,7,1
 multiset<int,Rule1>st2;
 //st2的元素排序规则为:个位数小的排在前面
 for(int i=0;i<10;++i)
  st2.insert(a[i]);
 multiset<int,Rule1>::iterator p;
 for(p=st2.begin();p!=st2.end();++p)
  cout<<*p<<",";
 cout<<endl;
 p=st2.find(133);
 cout<<*p<<endl;
 return 0;
//输出 1,21,12,13,13,14,7,8,8,19
 13
// find(x):在排序容器中找一个元素y,使得x必须排在y前面和y必须排
//x前面都不成立
}

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

扫描二维码关注公众号,回复: 10016789 查看本文章
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
struct Student{
 char name[20];
 int id;
 int score;
};
Student students []={{"Jack",112,78},{"Mary",102,85},
   {"Ala",333,92},{"Zero",101,70},{"Cindy",102,78}};
 struct Rule{
 boole operator()(const Student&s1,const Student &s2){
  if(s1.score!=s2.score)return s1.score>s2.score;
  else return (strcmp(s1.name,s2.name)<0);
 }
 };
int main(){
 multiest<Student,Rule>st;
 for(int i=0;i<5;++i)
  st.insert(students[i]);//插入的是studengts[i]的复制品
 multiset<Student,Rule>::iterator p;
 for(p=st.begin();p!=st.end();++p)
  cout<<p->score<<" "<<p->name<<" "
   <<p->id<<endl;
 Student s={"Mary",1000,85};
 p=st.find(s);
 if(p!=st.end())
 cout<<p->score<<" "<<p->name<<" "
   <<p->id<<endl;
  return 0;
 92 Ala 333
 85 Mary 102
 78 Cindy 102
 78 Jack 112
 70 Zero 101
 85 Mary 102
}

STL_set

set 和multiset的区别在于容器力不能有重复元素
a和b重复<=>a必须排在b前面和b必须排在a前面都不成立
set插入元素可能不成功

set的用法

#include<cstring>
#include<set>
using namespace std;
int main(){
set<int>st;
int a[10]={1,2,3,8,7,7,5,6,8,12};
for(int i=0;i<10;++i)
 st.insert(a[i]);
cout<<st.size()<<endl;//输出8
set<int>::iterator i;
for(i=st.begin();i!=st.end();++i)
cout<<*i<<",";//输出:1,2,3,5,6,7,8,12
cout<<endl;
pair<set<int>::iterator,bool>result=st.insert(2);
if(!result.second)//条件成立说明插入不成功
 cout<<*result.first<<"already exists"<<endl;
else
 cout<<*result.first<<"inserted"<<endl;
return 0;
//输出:2already exists
}

pair模板的用法

pair<T1,T2>类型等价于:
 struct{
  T1 first;
  T2 second;
 };
 例如:pair<int,double>a;
 等价于:
 struct{
  int first;
  double second;
 }a;
 a.first=1;
 a.second=93.93;
发布了68 篇原创文章 · 获赞 133 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_45822638/article/details/104987316
今日推荐