方法:multiset
定义了一个multiset变量st,st里面可以存放T类型数据,并且能自动排序。开始st为空
排序规则:表达式"a
可用的方法
目的 | 格式 |
---|---|
添加元素 | st.insert |
查找元素 | st.find |
删除元素 | st.erase |
复杂度都是 | log(n) |
用法
multiset上的迭代器:multiset
p是迭代器,相当于指针,可用于指向multiset中的元素。访问multiset中的元素要通过迭代器
与指针的不同:
multiset上的迭代器可++,–,用!=和==比较,不可比大小,不可加减整数,不可相减
st.begin()返回值类型为multiset::iterator, 是指向st中的头一个元素的迭代器
st.end()返回值类型为multiest::iterator,
是指向st中的最后一个元素后面的迭代器
对迭代器++,其就指向容器中的下一个元素,–则令其指向上一个元素
#include
#include
#include //使用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
#include
#include
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用法二
#include
#include
#include
#include
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
}
set 和multiset的区别在于容器力不能有重复元素
a和b重复<=>a必须排在b前面和b必须排在a前面都不成立
set插入元素可能不成功
set的用法
#include
#include
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;