set可以看作乙個集合,可以實現自動排序(公升序)和去重
在許多題目中,都可以使用這個模板庫,減少很多操作,例如p1923 第k小數,當然,這道題有很多奇奇怪怪的做法,分值都不同,之後會講解
set的定義
#include//標頭檔案
using namespace std; //這條必須加
seta; //同vector一樣,這裡可以用不同的資料型別
setb[size]; //定義set陣列,有點類似vector的二維陣列
//b[0]~b[size-1]都為set容器
其實很多與vector相似的地方,其他的許多stl容器感覺也都差不多。接下來是set的遍歷,和vector不一樣的是,這裡只能用迭代器遍歷,不能使用陣列下標
setname;
for(set::iterator it=name.begin();it!=name.end();it++) //只能使用迭代器訪問
然後是涉及到的一些函式(都只介紹常用的);
①insert( ) insert(x),將x放入集合中,並自動去重和公升序排序,時間複雜度為o(logn),n為元素個數
②find( ) find(x)返回set中對應值為x的迭代器,時間複雜度為o(logn)
③erase( ) 時間複雜度為o(1)
用法(1)erase(x)刪除對應值為x的元素;用法(2),同find( )一起使用,erase(find(x)),用find找到x的迭代器,然後刪除。
④同vector一樣,可以使用clear( ),時間複雜度為o(n);size( ),時間複雜度為o(1)
另外,set和map都是用紅黑樹來實現
p1932 第k小數
(一) 非常簡單暴力的思路,直接用sort快排,輸出,60分,超時
(二)學了set之後,因為set自動排序,就選用了set,至於找到第k個數,可以直接用迭代器初始值為a.begin( ),然後進行k次it++。結果只有20分,是因為set要去重,導致處理之後資料出錯
set::iterator it = a.begin( );
while(--k)it++;
cout << *it;
(三)在查詢了一些資料之後,發現有乙個東西叫做multiset,和set的許多用法相同,但是他處理資料是不會進行去重的,只會公升序排列。但是也只有60分,依然改變不了他超時的事實
multiset::iterator it = a.begin( );
while(k--)it++;
cout << *(it);
(四)無奈之下,通過題解,發現stl還有乙個叫做nth_element的東西,nth_element(a,a+k,a+n),三個引數分別指(陣列名,第k個,陣列長度)當時直接給我看懵了,100分做法
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
nth_element(a+1,a+k+1,a+1+n);
printf("%d",a[k+1]);
當然還可以用二分做,但這裡主要是講set,就不闡述了,通過這道題,可以加深對set的一些理解,例如做題時的選擇,是否考慮去重的問題,當然還有時間複雜度 map 初步學習STL
map get allocator include include includeusing namespace std int main int psize mapmymap pair p allocate an array of 5 elements using mymap s allocato...
STL學習之set容器
set容器只是單純的鍵的集合。除了兩種例外情況外,set容器支援大部分的map操作。建構函式 cpp view plain copy explicit set const compare comp compare const allocator allocator template class in...
STL學習 15 set集合
set multiset都是集合類,差別在於set中部允許有重複元素,multiset中允許有重複元素。常用函式 1 建構函式 set const pred comp pred const a al a 建立空集合 set const set x 拷貝建構函式 set const value typ...