STL初步學習(set)

2022-07-12 05:54:10 字數 1767 閱讀 9283

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...