set
\(set\)頭文件主要包括\(set\)和\(multiset\)兩個容器。他們都是有序集合,不過\(set\)存的元素不可重復。
兩者內部實現都是紅黑樹,在使用方法上差別不大,支持的函數基本相同。
聲明方式
set<int> s;
multiset<int> t;
set<int>::iterator it;
\(s\)與\(t\)都是維護\(int\)類型數據的有序容器,其中\(t\)內的元素可重。迭代器\(it\)僅支持\(++\)和\(--\)。我們以\(int\)類型的數據為例:
s.size()
返回元素個數。
s.empty()
判斷\(set\)是否為空,為空則是邏輯真,否則就是邏輯假。
s.clear()
清空\(set\)。
s.begin()/s.end()
返回\(set\)的首迭代器和尾迭代器。左閉右開,所以尾迭代器為空。
s.insert(x)/s.erase(it/x)
插入一個\(int\)類型的數據,刪除一個迭代器或者元素\(x\)。如果\(x\)已經是在集合中的了,並且是\(set\)而不是\(multiset\),那么就不會執行插入操作。時間復雜度為\(O(log)\)。如果是\(multiset\)則會把所有等於\(x\)的元素全部刪除,復雜度為\(O(log+k)\),\(k\)為元素個數。
s.find(x)
查找等於\(x\)的元素,返回一個迭代器。若不存在,則返回\(s.end()\)。復雜度\(O(log)\)的。
s.lower_bound(x)/s.upper_bound(x)
第一個是找\(set\)中大於等於\(x\)的最小的元素,第二個是找\(set\)中嚴格大於\(x\)的最小的元素,以迭代器的形式返回。時間復雜度為\(O(log)\)。若不存在,則返回\(s.end\)()。
s.count(x)
返回集合中等於\(x\)的元素個數。復雜度為\(O(log+k)\),\(k\)為元素個數。