這兩天學習了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