c++ stl集合set介紹 c++ stl集合(Set)是一種包含已排序對象的關聯容器。set/multiset會根據待定的排序准則,自動將元素排序。兩者不同在於前者不允許元素重復,而後者允許。1) 不能直接改變元素值,因為那樣會打亂原...
c++ stl集合set介紹
c++ stl集合(Set)是一種包含已排序對象的關聯容器。set/multiset會根據待定的排序准則,自動將元素排序。兩者不同在於前者不允許元素重復,而後者允許。
1) 不能直接改變元素值,因為那樣會打亂原本正確的順序,要改變元素值必須先刪除舊元素,則插入新元素
2) 不提供直接存取元素的任何操作函數,只能通過迭代器進行間接存取,而且從迭代器角度來看,元素值是常數
3) 元素比較動作只能用於型別相同的容器(即元素和排序准則必須相同)
set模板原型://Key為元素(鍵值)類型
template, class Alloc=STL_DEFAULT_ALLOCATOR(Key) >
從原型可以看出,可以看出比較函數對象及內存分配器采用的是默認參數,因此如果未指定,它們將采用系統默認方式。
set的各成員函數列表如下:
c++ stl容器set成員函數:begin()--返回指向第一個元素的迭代器
c++ stl容器set成員函數:clear()--清除所有元素
c++ stl容器set成員函數:count()--返回某個值元素的個數
c++ stl容器set成員函數:empty()--如果集合為空,返回true
c++ stl容器set成員函數:end()--返回指向最後一個元素的迭代器
c++ stl容器set成員函數:equal_range()--返回集合中與給定值相等的上下限的兩個迭代器
c++ stl容器set成員函數:erase()--刪除集合中的元素
c++ stl容器set成員函數:find()--返回一個指向被查找到元素的迭代器
c++ stl容器set成員函數:get_allocator()--返回集合的分配器
c++ stl容器set成員函數:insert()--在集合中插入元素
c++ stl容器set成員函數:lower_bound()--返回指向大於(或等於)某值的第一個元素的迭代器
c++ stl容器set成員函數:key_comp()--返回一個用於元素間值比較的函數
c++ stl容器set成員函數:max_size()--返回集合能容納的元素的最大限值
c++ stl容器set成員函數:rbegin()--返回指向集合中最後一個元素的反向迭代器
c++ stl容器set成員函數:rend()--返回指向集合中第一個元素的反向迭代器
c++ stl容器set成員函數:size()--集合中元素的數目
c++ stl容器set成員函數:swap()--交換兩個集合變量
c++ stl容器set成員函數:upper_bound()--返回大於某個值元素的迭代器
c++ stl容器set成員函數:value_comp()--返回一個用於比較元素間的值的函數
c++ stl集合set插入,遍歷用法舉例
#include#include using namespace std; //set插入元素操作 int main() { //定義一個int型集合對象s,當前沒有任何元素.由www.169it.com搜集整理 set s; s.insert(8); //第一次插入8,可以插入 s.insert(1); s.insert(12); s.insert(6); s.insert(8); //第二次插入8,重復元素,不會插入 set ::iterator it; //定義前向迭代器 //中序遍歷集合中的所有元素 for(it=s.begin();it!=s.end();it++) cout<<*it<
更詳細點的用法舉例
#include#include #include using namespace std; struct strLess { bool operator() (const char *s1, const char *s2) const { return strcmp(s1, s2) < 0; } }; void printSet(set s) { copy(s.begin(), s.end(), ostream_iterator (cout, ", ") ); // set ::iterator iter; // for (iter = s.begin(); iter != s.end(); iter++) // //cout<<"set["< s1; //創建空的set對象,元素類型char*,比較函數對象(即排序准則)為自定義strLess set s2( strLess); //利用set對象s1,拷貝生成set對象s2 set s3(s1); //用迭代區間[&first, &last)所指的元素,創建一個set對象 int iArray[] = {13, 32, 19}; set s4(iArray, iArray + 3); //用迭代區間[&first, &last)所指的元素,及比較函數對象strLess,創建一個set對象 const char* szArray[] = {"hello", "dog", "bird" }; set s5(szArray, szArray + 3, strLess() ); //元素插入: //1,插入value,返回pair配對對象,可以根據.second判斷是否插入成功。(提示:value不能與set容器內元素重復) //pair insert(value) //2,在pos位置之前插入value,返回新元素位置,但不一定能插入成功 //iterator insert(&pos, value) //3,將迭代區間[&first, &last)內所有的元素,插入到set容器 //void insert[&first, &last) cout<<"s1.insert() : "< ::iterator::iterator, bool> p;\np = s1.insert(60);\nif (p.second):"< ::iterator::iterator, bool> p; p = s1.insert(60); if (p.second) {cout<<"Insert OK!"< ::iterator iter = s1.begin(); s1.erase(iter); printSet(s1); //元素查找 //count(value)返回set對象內元素值為value的元素個數 //iterator find(value)返回value所在位置,找不到value將返回end() //lower_bound(value),upper_bound(value), equal_range(value) 略 cout<<"\ns1.count(10) = "< s9; s9.insert(100); cout<<" s1:="" s9:="" pre="">
自定義比較函數
使用insert將元素插入到集合中去的時候,集合會根據設定的比較函數獎該元素放到該放的節點上去。在定義集合的時候,如果沒有指定比較函數,那麼采用默認的比較函數,即按鍵值從小到大的順序插入元素。但在很多情況下,需要自己編寫比較函數。
編寫比較函數有兩種方法。
(1)如果元素不是結構體,那麼可以編寫比較函數。下面的程序比較規則為按鍵值從大到小的順序插入到集合中。
#include#include using namespace std; struct mycomp { //自定義比較函數,重載“()”操作符 bool operator() (const int &a, const int &b) { if(a != b) return a > b; else return a > b; } }; int main() { set s; //采用比較函數mycomp s.insert(5); //第一次插入5,可以插入 s.insert(1); s.insert(6); s.insert(3); s.insert(5); //第二次插入5,重復元素,不會插入 set ::iterator it; for(it = s.begin(); it != s.end(); it++) cout << *it << " "; cout << endl; return 0; } /* 運行結果:6 5 3 1 */ (2)如果元素是結構體,那麼可以直接把比較函數寫在結構體內。
#include#include #include using namespace std; struct Info { string name; double score; bool operator < (const Info &a) const // 重載“<”操作符,自定義排序規則 { //按score由大到小排序。如果要由小到大排序,使用“>”即可。 return a.score < score; } }; int main() { set s; Info info; //插入三個元素 info.name = "Jack"; info.score = 80; s.insert(info); info.name = "Tom"; info.score = 99; s.insert(info); info.name = "Steaven"; info.score = 60; s.insert(info); set ::iterator it; for(it = s.begin(); it != s.end(); it++) cout << (*it).name << " : " << (*it).score << endl; return 0; } /* 運行結果: Tom : 99 Jack : 80 Steaven : 60 */
集合的用法
#include #include#include using namespace std; int main() { int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; set S( a, a + 9 ); int b[] = { 3, 6, 8, 9 }; set S2( b, b + 4 ); set ::iterator site; set Su; set Si; set Sd; set Ssd; //交集 set_intersection( S.begin(), S.end(), S2.begin(), S2.end(), inserter( Si, Si.begin() ) ); //並集 set_union( S.begin(), S.end(), S2.begin(), S2.end(), inserter( Su, Su.begin() ) ); //差集 set_difference( S.begin(), S.end(), S2.begin(), S2.end(), inserter( Sd, Sd.begin() ) ); //對稱差集 set_symmetric_difference( S.begin(), S.end(), S2.begin(), S2.end(), inserter( Ssd, Ssd.begin() ) ); site = Si.begin(); cout<<"the intersection of S and S2 is : "; while( site != Si.end() ) { cout<< *site <<" "; ++ site; } cout<