2021-01-02

羽工作室發表於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中的最後一個元素後面的迭代器

  • 對迭代器++,其就指向容器中下一個元素,–則令其指向上一個元素。

相關文章