2021-01-02
STL中的平衡二叉樹(multiset)
運用場景:有時需要在大量增加,刪除資料的同時,還要進行大量資料的查詢
希望增加資料,刪除資料,查詢資料都能在log(n)複雜度完成。
排序+二分查詢顯然不可以,因加入新資料就需要重新排序
可以使用“排序二叉樹”資料結構存放資料,體現在STL中,就是以下四種“排序他容器”
multiset set multimup map
multiset < T > st;
- 定義了一個multiset變數st,st裡面可以存放T型別的資料,並且能自動排序。開始st為空。
- 排序規則:表示式“a<b"為true,則a排在b前面。
- 可用st.insert新增元素,st.find 查詢元素,st.erase刪除元素,複雜度都是log(n)
用例:
#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上的迭代器
multiset < T> ::iterator p;
(p是一個變數名,可以隨便換)
-
p是迭代器,相當於指標,可用於指向multiset中的元素。訪問multiset中的元素要通過迭代器。
-
與指標的不同
multiset上的迭代器可++,–,用!=和==比較,不可比大小,不可加減整數,不可相減。
-
st.begin()返回值型別為multiset< T>::iterator,
是指向st中的頭一個元素的迭代器
-
st.end()返回值型別為multiset< T >::iterator,
是指向st中的最後一個元素後面的迭代器
-
對迭代器++,其就指向容器中下一個元素,–則令其指向上一個元素。