《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;