三、①set集合容器
簡介:set集合的目的就是為了快速檢索。set集合容器實現了紅黑樹的平衡二叉檢索樹的數據結構。set集合里面不允許有重復的元素出現;使用set容器前,需要在程序的頭文件中聲明 #include < set >。
函數方法總結:
1,元素的插入與中序遍歷 insert();
2,元素的反向遍歷,使用反向迭代器reverse_iterator,可以反向遍歷集合,其中rbegin()和rend()這兩個方法,分別給出了反向遍歷的開始位置和結束位置。
3,元素的刪除
?刪除set中迭代器所指的一個元素或一段區間中的所有元素 erase();
?一次性刪除set中的所有元素 clear();
4,元素的檢索,若找到查找的鍵值,則返回該鍵值的迭代器位置,否則返回集合最后一個元素后面的一個位置及end() find();
5,自定義比較函數
1,set容器中元素的插入與中序遍歷
#include <iostream>
#include<set>
using namespace std;int main()
{//set集合容器默認的比較規則下,是按元素由小到大插入set<int> s; //定義元素類型為int類型的集合對象s,當前沒有任何元素s.insert(1); //第一次插入1這個元素s.insert(0);s.insert(4);s.insert(1); //第二次插入1,重復元素,不會插入set<int> :: iterator it; //定義前向迭代器it//使用前向迭代器對集合中序遍歷,其結果正好是元素排序的結果for(it=s.begin();it!=s.end();it++){cout << *it <<" ";}//輸出結果:0 1 4 從小到大排序,如果是前向迭代器迭代輸出直接默認升序排列輸出return 0;
}
2,元素的反向遍歷
#include <iostream>
#include<set>
using namespace std;int main()
{set<int> s; //定義元素類型為int類型的集合對象s,當前沒有任何元素s.insert(1); //第一次插入1這個元素s.insert(0);s.insert(4);s.insert(1); //第二次插入1,重復元素,不會插入set<int> :: reverse_iterator it; //定義反向迭代器itfor(it=s.rbegin();it!=s.rend();it++){cout << *it <<" ";}//輸出結果:4 0 1 反向迭代輸出,不排序,僅僅反向輸出而已return 0;
}
3,元素的刪除
#include <iostream>
#include<set>
using namespace std;int main()
{//set集合容器默認的比較規則下,是按元素由小到大插入set<int> s; //定義元素類型為int類型的集合對象s,當前沒有任何元素s.insert(1); //第一次插入1這個元素s.insert(0);s.insert(4);s.insert(1); //第二次插入1,重復元素,不會插入s.erase(0); //刪除鍵值為0的那個元素set<int> :: iterator it; //定義前向迭代器it//使用前向迭代器對集合中序遍歷,其結果正好是元素排序的結果for(it=s.begin();it!=s.end();it++){cout << *it <<" ";}//輸出結果:1 4 前向迭代輸出cout <<endl;s.clear(); // 清空set集合s里面的所有元素cout<<s.size()<<endl;//輸出結果為:0return 0;
}
4,元素的檢索
#include <iostream>
#include<set>
using namespace std;int main()
{set<int> s ;s.insert(0);s.insert(1);s.insert(2);s.insert(3);s.insert(4);s.insert(5);s.insert(6);set <int> ::iterator it; //定義前向迭代器itit=s.find(4); //找4這個元素if(it!=s.end()) //若沒到末尾之前找到了{cout << *it <<endl; //輸出該值}//輸出結果: 4else{cout << "not find it"<<endl; //沒找到輸出 not find it}return 0;
}
5,自定義比較函數
?如果元素不是結構體,那么可以編寫比較函數
#include <iostream>
#include<set>
using namespace std;struct myComp
{//C++ const 允許指定一個語義約束,編譯器會強制實施這個約束,允許程序員告訴編譯器某值是保持不變的。如果在編程中確實有某個值保持不變,就應該明確使用const,這樣可以獲得編譯器的幫助。 bool beyond(const int &a,const int &b)//自己定義比較函數,要求由大到小排序//自定義比較函數myComp,重載“()”操作符bool operator()(const int &a,const int &b){if(a!=b)return a>b;elsereturn a>b;}
};int main()
{set<int> s;s.insert(2);s.insert(4);s.insert(1);s.insert(8);s.insert(9);s.insert(8); //第一次有8這個元素了,第二次不會再填進去set<int,myComp> :: iterator it; //定義前向迭代器for(it=s.begin();it!=s.end();it++){cout << *it <<" ";}//輸出結果:1 2 4 8 9//??????有疑問??????按理說應該是 9 8 4 2 1cout<<endl;return 0;
}
?如果元素是結構體,那么可以直接把比較函數寫在結構體內
#include <iostream>
#include<set>
#include<string>
using namespace std;struct Info{string name;float score;//按分數高低排序bool operator < (const Info &a) const //重載“<”操作符,自定義排序規則{return a.score<score; //按score由大到小排列,如果要由小到大,使用“>”即可}
};
int main()
{set<Info> s; //定義元素類型為Info結構體的集合對象s,當前沒有任何元素Info info; //定義Info類型元素//插入三個元素info.name="wsq";info.score=100.0;s.insert(info);info.name="beyond";info.score=99.5;s.insert(info);info.name="yy";info.score=66.6;s.insert(info);set<Info> :: iterator it;for(it=s.begin();it!=s.end();it++){cout<<(*it).name<<":"<<(*it).score<<endl;}return 0;
}
三、②multiset多重集合容器
簡介:multiset和set一樣,也是使用紅黑樹來組織元素數據的,唯一不同的是,multiset允許重復的元素鍵值插入,而set則不允許。使用multiset集合容器的時候,需要在頭文件進行聲明 #include< set >。
函數方法總結
1,multiset元素的插入 insert();
2,元素的刪除
?刪除multiset對象中的某個迭代器位置上的元素、某段迭代器區間中的元素、鍵值等于某個值的所有重復元素,并返回刪除元素的個數 erase();
?一次性刪除multiset中的所有元素 clear();
3,查找元素,使用find()方法查找元素,若找到返回該元素的迭代器位置(若重復,則返回第一個元素重復元素的迭代器的位置);若沒有找到,則返回end()迭代器的位置。
1,multiset元素的插入與刪除
#include <iostream>
#include<set>
#include<string>
using namespace std;int main()
{multiset<string> ms; //定義一個string類型的multiset集合容器 msms.insert("wsq"); //插入字符串ms.insert("1014");ms.insert("1202");ms.insert("wsq");ms.insert("1014");multiset<string>::iterator it; //定義前向迭代器it,會對multiset集合容器里面的元素默認進行升序排列for(it=ms.begin();it!=ms.end();it++){cout<<*it<<" "; //從輸出結果就可以看出multiset集合容器可以存儲重復的元素}//輸出結果:1014 1014 1202 wsq wsqcout << endl<<endl;int n = ms.erase("1014"); //刪除值為“1014”的所有重復元素,返回刪除元素的總數2cout << "all elements after deleted :"<<n<<endl;for(it=ms.begin();it!=ms.end();it++){cout << *it <<" ";}cout <<endl;ms.clear(); //刪除ms容器里面的所有元素cout << ms.size()<<endl; //返回ms容器的長度return 0;
}
2,查找元素
#include <iostream>
#include<set>
#include<string>using namespace std;int main()
{multiset<string> ms; //定義一個string類型的multiset集合容器 msms.insert("wsq"); //插入字符串ms.insert("1014");ms.insert("1202");ms.insert("wsq");ms.insert("1014");multiset<string>::iterator it; //定義前向迭代器it,會對multiset集合容器里面的元素默認進行升序排列it = ms.find("wsq"); //查找"wsq"這個字符串if(it!=ms.end()){cout << *it <<endl; //查找到之后輸出}else{cout<<"not find it"<<endl; //若沒有找打}it = ms.find("yy"); //查找"yy"字符串if(it!= ms.end()) //若找到{cout<<*it<<endl;}else //若找不到{cout<<"not find it"<<endl;}//由于有“wsq”這個字符串,所有輸出“wsq”這個字符串,但是沒有“yy”這個字符串,所以輸出“not find it”//輸出結果:wsq (換行) not find itreturn 0;
}