SET的一些知識點

這兩天學習了STL,準備找幾道題練練手,在這個過程中,總結了一些小的知識點。

1、set集合容器實現了紅黑樹的二叉檢索樹的數據結構,在插入元素時,它會自動調整二叉樹的排列,把該元素放到適當的位置,以確保每個子樹根節點的鍵值大於左子樹所有節點的鍵值,而小於右子樹所有節點的鍵值。

2、平衡二叉檢索樹的檢索使用中序遍歷算法,檢索效率高於vector、deque、list容器。將鍵值由小到大遍歷出來,並且不會重複插入相同鍵值的元素,採取忽略處理。如果是一個結構體其中有三個int型元素a,b,c,如果有插入的a相同,則這組數據被忽略,如插入1  2  3、1  2  4、1   3  4;則只會插入1 2 3,因爲首元素相同,所以採取忽略處理。而除首元素其他元素相同則可以插入。

3、iterator迭代器的作用是遍歷容器。

4、在5下面有以下知識點的練習。

      創建元素:set<int>s,需要說明元素的類型;

      元素的插入:s.insert(需要插入的元素),如:s.insert(8),插入元素8;

      中序遍歷:set<int> :: iterator  it;

                         for( it=s.begin() ; it !=s.end();it++)

                        {

                              cout<<*it<<"  ";

                        }

       反向遍歷:set<int> :: reverse_iterator it;

                           for( it=s.rbegin() ; it !=s.rend();it++)

                        {

                              cout<<*it<<"  ";

                        }

      元素的刪除:s.erase(6); 刪除鍵值爲6的元素;

      元素的查找:set<int>::iterator  it;

                             it=s.find(6);

                            if (it != s.end() )

                                 cout<<“找到該元素”;

5、自定義比較元素:

          1>  不是結構體的元素、按鍵值由大到小:

#include<set>
#include<iostream>
using namespace std;
//自定義比較函數mycomp,重載"()"操作符
struct mycomp
{
        bool operator ()(const int &a,const int &b)
        {
                   return a>b;
        }
};
int main()
{
        //定義元素類型爲int型的集合對象s,當前沒有任何元素
        //採用的比較函數是mycomp
        set<int,mycomp>s;
        //插入5個元素,由於8有重複,所以第二次的8並沒有執行
        s.insert(8);
        s.insert(1);
        s.insert(12);
        s.insert(6);
        s.insert(8);//第二次插入8,重複元素,不會插入
        set<int,mycomp>::iterator it;
        for(it=s.begin();it!=s.end();it++)
          cout<<*it<<" ";
        cout<<endl;
        return 0;
}

運行結果:

    12  8  6  1

       

2>如果元素是結構體,那麼直接可以把比較函數寫在結構體內。下面的程序說明了如何操作:

#include<set>
#include<iostream>
using namespace std;
struct INFO
{
        string name;
        float score;
        bool operator < (const INFO &a) const
        {
                return a.score<score;
        }
};
int main()
{
        //定義元素類型爲INFO結構體的集合對象s,當前沒有任何元素
        set<INFO>s;
        INFO info;
        info.name="Jack";
        info.score=80.5;
        s.insert(info);
        info.name="Tomi";
        info.score=20.5;
        s.insert(info);
        info.name="Nacy";
        info.score=60.5;
        s.insert(info);
        set<INFO>::iterator it;
        for(it=s.begin();it!=s.end();it++)
        {
                cout<<(*it).name<<":"<<(*it).score<<endl;
        }
        return 0;
}

運行結果:

Jack:80.5

Nacy:60.5

Tomi:20.5

 


 


   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章