运用场景:有时需要在大量增加,删除数据的同时,还要进行大量数据的查找
希望增加数据,删除数据,查找数据都能在log(n)复杂度完成。
排序+二分查找显然不可以,因加入新数据就需要重新排序
可以使用“排序二叉树”数据结构存放数据,体现在STL中,就是以下四种“排序他容器”
multiset set multimup map
用例:
#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 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())//找不到则返回值为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 ,使得[it,end())中的元素都在8后面,复杂度log(n).
cout<<*i<<endl;
st.erase(i);//删除迭代器i指向的元素,即12
for(i=st.begin();i!=st.end();++i)
cout<<*i<<",";
return 0;
}
multiset < T> ::iterator p;
(p是一个变量名,可以随便换)
p是迭代器,相当于指针,可用于指向multiset中的元素。访问multiset中的元素要通过迭代器。
与指针的不同
multiset上的迭代器可++,–,用!=和==比较,不可比大小,不可加减整数,不可相减。
st.begin()返回值类型为multiset< T>::iterator,
是指向st中的头一个元素的迭代器
st.end()返回值类型为multiset< T >::iterator,
是指向st中的最后一个元素后面的迭代器
对迭代器++,其就指向容器中下一个元素,–则令其指向上一个元素。
因篇幅问题不能全部显示,请点此查看更多更全内容