在插入元素時,就會自動將元素按鍵值由小到大的順序排列。對于 set 容器中的鍵值,不可直接去修改。因為如果把容器中的一個鍵值修改了,set容器會根據(jù)新的鍵值旋轉(zhuǎn)子樹,以保持新的平衡,這樣,修改的鍵值很可能就不在原先那個位置上了。換句話來說,構造set 集合的主要目的就是為了快速檢索。頭文件:#include <set> 創(chuàng)建對象:set<int> s;采用 insert()方法把元素插入集合中去,插入的具體規(guī)則在默認的比較規(guī)則下,是按元素值由小到大插入,如果自己指定了比較規(guī)則函數(shù),則按自定義比較規(guī)則函數(shù)插入。使用前向迭代器對集合中序遍歷,其結果正好是元素排序的結果。#include <set>#include <iostream>using namespace std;int main(int argc, char* argv[]){//定義元素類型為int 的集合對象s,當前沒有任何元素set<int> s;//插入了5 個元素,但由于8 有重復,第二次插入的8 并沒有執(zhí)行s.insert(8);//第一次插入8,可以插入s.insert(1);s.insert(12);s.insert(6);s.insert(8);//第二次插入8,重復元素,不會插入//中序遍歷集合中的元素set<int>::iterator it;//定義前向迭代器//中序遍歷集合中的所有元素for(it=s.begin();it!=s.end();it++){cout<<*it<<" ";}cout<<endl;//回車換行return 0;}運行結果:1 6 8 12元素的反向遍歷:使用反向迭代器 reverse_iterator 可以反向遍歷集合,輸出的結果正好是集合元素的反向排序結果。它需要用到rbegin()和rend()兩個方法,它們分別給出了反向遍歷的開始位置和結束位置。//反向遍歷集合中的元素set<int>::reverse_iterator rit;//定義反向迭代器for(rit=s.rbegin();rit!=s.rend();rit++){cout<<*rit<<" ";}元素的刪除:與插入元素的處理一樣,集合具有高效的刪除處理功能,并自動重新調(diào)整內(nèi)部的紅黑樹的平衡。刪除的對象可以是某個迭代器位置上的元素、等于某鍵值的元素、一個區(qū)間上的元素和清空集合。set<int> s;//插入了5 個元素,但由于8 有重復,第二次插入的8 并沒有執(zhí)行s.insert(8);//第一次插入8,可以插入s.insert(1);s.insert(12);s.insert(6);s.insert(8);//第二次插入8,重復元素,不會插入//刪除鍵值為6 的那個元素s.erase(6);輸出:1 8 12元素的檢索 :使用 find()方法對集合進行搜索,如果找到查找的鍵值,則返回該鍵值的迭代器位置,否則,返回集合最后一個元素后面的一個位置,即end()。set<int>::iterator it;//定義前向迭代器//查找鍵值為6 的元素it=s.find(6);if(it!=s.end())//找到cout<<*it<<endl; //it相當于地址,,如果找到了,這里輸出的是元素本身自定義比較函數(shù):(1)如果元素不是結構體,那么,可以編寫比較函數(shù)。//自定義比較函數(shù)myComp,重載“()”操作符 ,該函數(shù)使鍵值從大到小排列struct myComp{bool Operator()(const int &a,const int &b){if(a!=b)return a>b;elsereturn a>b;}};set<int,myComp>::iterator it;//定義前向迭代器for(it=s.begin();it!=s.end();it++){cout<<*it<<" ";}(2)如果元素是結構體,那么,可以直接把比較函數(shù)寫在結構體內(nèi)。struct Info{string name;float score;//重載“<”操作符,自定義排序規(guī)則bool operator < (const Info &a) const{//按score 由大到小排列。如果要由小到大排列,使用“>”號即可。return a.score<score;}};int main(int argc, char* argv[]){//定義元素類型為Info 結構體的集合對象s,當前沒有任何元素set<Info> s;//定義Info 類型的元素Info info;//插入3 個元素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.5Nacy : 60.5Tomi : 20.5新聞熱點
疑難解答