set——迭代器干貨


Set是什么


Set是C++STL中提供的容器,set是數學上的集合——具有唯一性,即每個元素只出現一次,而multiset則是可重集,兩者的內部實現是一棵紅黑樹,它們支持的函數基本相同


Set的相關操作


頭文件

#include<set>

 


像這樣:

set<類型>名稱;

比如:

set<int>s;
set<vector<int> >s;        //vector中提供重載<
set<set<int> >s;    //平衡樹嵌套,哈哈
multiset<double>s;

就像其他需要排序的數據類型一樣,為一個結構體的set,需要重載小於號

復制代碼
struct node{
    ......;
};
set<node>s;
bool operator <(const node &ai,const node &bi)
{
    return ai.x>bi.x;
}
復制代碼

 

set.size()


統計set中元素個數,函數返回一個整形變量,表示set中元素個數,時間復雜度O(1)

用法:名稱.size();
eg.
int num=s.size();


set.empty()


檢查set是否為空,返回一個bool型變量,1表示set為空,否則為非空,時間復雜度O(1)

用法:名稱.empty();
eg.
if(s.empty())
    cout<<"Myset is Empty."<<endl;


set.clear()


清空set,無返回值

用法:名稱.clear();
eg.
s.clear();


set.count(x)


返回set或multiset中值為x的元素個數,時間復雜度為O(log n)

用法:名稱.count(x)
eg.
if(!s.count(x))
    ans++;


迭代器


雙向訪問迭代器,不支持隨機訪問,支持星號解除引用,僅支持“++”,“--”這兩個算術操作
引用和操作:

set<類型>::iterator it;
eg.
set<int>::iterator it=s.begin();
it++;
it--;


若把it++,則it將會指向“下一個”元素。這里的下一個是指在key從小到大排序的結果中,排在it下一名的元素。同理,若把it--,則it會指向排在上一個的元素

“++”,“--”操作的復雜度均為O(log n)


遍歷set及訪問其中的元素

復制代碼
//set
for(set<int>::iterator it=s.begin();it!=s.end();it++)
    cout<<*it<<endl;    //取出這個迭代器指向的元素
//set嵌套
for(set<set<int> >::iterator it=s.begin();it!=s.end();it++)
{
    //首先取出set中嵌套的set
    for(set<int>::iterator rit=(*it).begin();rit!=(*it).end();rit++)
        cout<<*rit<<' ';    //遍歷這個set
    cout<<endl;
}
復制代碼


set.begin()


返回集合的首迭代器,即指向集合中最小元素的迭代器,時間復雜度為O(1)

用法:名稱.begin();
eg.
map<int>::iterator it=s.begin();


set.end()


返回集合的尾迭代器,眾所周知,STL中區間都是左閉右開的,那么end()函數返回的迭代器即為指向集合中最大元素的下一個位置的迭代器,因此--s.end()才是指向集合中最大元素的迭代器,時間復雜度為O(1)

用法:名稱.end();
eg.
maxn=*(--s.end());        //取出最大元素


set.insert(x)


在set中插入元素,返回插入地址的迭代器和是否插入成功的bool並成的pair,時間復雜度為O(log n)

PS:set在進行插入的時候是不允許有重復的鍵值的,如果新插入的鍵值與原有的鍵值重復則插入無效(multiset可以重復)

用法:名稱.insert(set類型);
eg.
s.insert(3);


set.erase(參數)


刪除,參數可以是元素或者迭代器,返回下一個元素的迭代器,時間復雜度為O(log n),注意在multiset中s.erase(x)會刪除所有值為x的元素

用法:名稱.erase(參數);
eg.
set<int>::iterator it=s.begin();
s.erase(it);
s.erase(3);


set.find(x)


在set中查找值為x的元素,並返回指向該元素的迭代器,若不存在,返回set.end(),時間復雜度為O(log n)

用法:名稱.find(x);
eg.
if(s.find(x)!=s.end())
    cout<<"Have Found!"<<endl;


set.lower_bound(x)/upper_bound(x)


兩個神奇的東西,決定把他們放在一塊談一談

用法與find類似,但查找的條件略有不同,時間復雜度O(log n)

s.lower_bound(x)表示查找>=x的元素中最小的一個,並返回指向該元素的迭代器

s.upper_bound(x)表示查找>x的元素中最小的一個,並返回指向該元素的迭代器

舉個例子:

在set{3,5,7,8,13,16}中

對於在set中存在的元素,比如8

s.lower_bound(8)返回8所在位置的迭代器

s.upper_bound(8)返回13所在位置的迭代器

對於在set中不存在的元素,比如12

兩個函數返回的則都是13所在位置的迭代器


特殊地,


對於比set中最大的元素大的元素,比如20

兩個函數返回的都是s.end()

本篇文章轉載:https://www.cnblogs.com/ivanovcraft/p/9191027.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM