STL—— set的使用

1數(shù)據(jù)插入

1.1 insert插入數(shù)據(jù)

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
void Display(int val){
    cout << val << endl;
}
int main(){
    set<int> m;
    for(int i=0;i<10;i++){
        m.insert(i);
    }
    for_each(m.begin(),m.end(),Display);
}

1.2 insert指定位置插入數(shù)據(jù)

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
void Display(int val){
    cout << val << endl;
}
int main(){
    set<int> m;
    for(int i=0;i<10;i++){
        m.insert(i);
    }
    m.insert(m.begin(),100);
    for_each(m.begin(),m.end(),Display);
}

插入數(shù)據(jù)總是認(rèn)為成功,如果已經(jīng)存在湾宙,則返回已經(jīng)存在的位置迭代器樟氢,否則,添加新的值侠鳄,且返回位置迭代器埠啃。

1.3 數(shù)組/vector構(gòu)建set

  1 #include <iostream>
  2 #include <set>
  3 #include <algorithm>
  4 
  5 using namespace std;
  6 
  7 void Print(int n)
  8 {
  9     cout<<n<<" ";
 10 }
 11 
 12 
 13 int main()
 14 {
15      int arr[] = {1,2,3,3,6,6,5,5,4,4,7};
 16     set<int> s(arr,arr+sizeof(arr)/sizeof(arr[0]));    //由數(shù)組構(gòu)建set
 17     for_each(s.begin(),s.end(),Print);
 18     cout<<endl;
 19 
 20     s.erase(s.begin(),s.end());
 21     for_each(s.begin(),s.end(),Print);
 22     cout<<endl;
 23 
 24     vector<int> vec(arr,arr+sizeof(arr)/sizeof(arr[0]));
 25     set<int> s1(vec.begin(),vec.end());     //由vector構(gòu)建set
 26     for_each(s1.begin(),s1.end(),Print);
 27     cout<<endl;
 28 }
//set可以做去重和排序處理
1 2 3 4 5 6 7 

1 2 3 4 5 6 7 

2遍歷

  • 迭代器for循環(huán)
for(set<int>::iterator it = m.begin();it != m.end();it++){
        cout << *it << endl; 
}
  • for_each()循環(huán)[推薦]
    定義函數(shù)指針
inline void Display(int val){
    cout << val << endl;
}

執(zhí)行for_each

for_each(m.begin(),m.end(),Display);
  • C++11auto迭代器寫(xiě)法
for(auto it = m.begin();it != m.end();it++){
        cout << *it << endl; 
}
  • C++11 for-loop-scope迭代器寫(xiě)法[推薦]
for(auto p : m){
    cout << p << endl;
}
  • C++11 for_each()與lamdba表達(dá)式
for_each(m.begin(),m.end(),[](int p){
    cout << p << endl;
});

3.查找

3.1 count()判斷值是否存在

if(m.count(val) == 1){
  //如果存在
     ...
}

3.2 find()判斷值是否存在以及位置

set<int>::iterator it = m.find(val);
if(m.end() != it){
     ...
}

4.刪除

  • 關(guān)鍵字刪除
m.erase(val);
  • 迭代器刪除
m.erase(m.begin());
  • 區(qū)域刪除
m.erase(it_a,it_b);

5.排序

默認(rèn)按照val升序排列。自定義排序時(shí)伟恶,可以在實(shí)例化加上val的comp仿函數(shù)或者重載<運(yùn)算符碴开。

set<value類型,comp> m;

6應(yīng)用

set除了去重和排序的功能,還有一個(gè)應(yīng)用是判斷重復(fù)次數(shù)博秫。
例如:

給定一個(gè)非空整數(shù)數(shù)組潦牛,除了某個(gè)元素只出現(xiàn)一次以外,其余每個(gè)元素均出現(xiàn)兩次挡育。找出那個(gè)只出現(xiàn)了一次的元素巴碗。
說(shuō)明:
你的算法應(yīng)該具有線性時(shí)間復(fù)雜度。 你可以不使用額外空間來(lái)實(shí)現(xiàn)嗎即寒?
示例 1:
輸入: [2,2,1]
輸出: 1
示例 2:
輸入: [4,1,2,1,2]

輸出: 4

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        set<int> s;
        for(int i = 0;i < nums.size();i++)
        {
            if(s.count(nums[i]) == 0)        //如果當(dāng)前set有num[i]元素則刪除它橡淆,如果沒(méi)有則插入 
                s.insert(nums[i]);            
            else
                s.erase(nums[i]);
        }
        return *s.begin();     //最后剩下的就是唯一一個(gè)只出現(xiàn)了一次的元素
    }
};

但是這代碼有局限性,假設(shè)其余每個(gè)元素不止出現(xiàn)兩次母赵,上面代碼就不能用了逸爵,如果是這種情況就應(yīng)該考慮使用map了,找出value為1的元素就可以了凹嘲。

不管是用map還是set都算使用了額外的空間痊银,這個(gè)題目可以更加優(yōu)化,兩個(gè)相同數(shù)字異或等于0施绎,所以可以遍歷數(shù)組溯革,最后剩下的也就是只出現(xiàn)一次的數(shù)字。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谷醉,一起剝皮案震驚了整個(gè)濱河市致稀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俱尼,老刑警劉巖抖单,帶你破解...
    沈念sama閱讀 210,835評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異遇八,居然都是意外死亡矛绘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)刃永,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)货矮,“玉大人,你說(shuō)我怎么就攤上這事斯够∏裘担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,481評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵读规,是天一觀的道長(zhǎng)抓督。 經(jīng)常有香客問(wèn)我,道長(zhǎng)束亏,這世上最難降的妖魔是什么铃在? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,303評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮碍遍,結(jié)果婚禮上定铜,老公的妹妹穿的比我還像新娘。我一直安慰自己雀久,他們只是感情好宿稀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,375評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著赖捌,像睡著了一般祝沸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上越庇,一...
    開(kāi)封第一講書(shū)人閱讀 49,729評(píng)論 1 289
  • 那天罩锐,我揣著相機(jī)與錄音,去河邊找鬼卤唉。 笑死涩惑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桑驱。 我是一名探鬼主播竭恬,決...
    沈念sama閱讀 38,877評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼跛蛋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了痊硕?” 一聲冷哼從身側(cè)響起赊级,我...
    開(kāi)封第一講書(shū)人閱讀 37,633評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岔绸,沒(méi)想到半個(gè)月后理逊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,088評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盒揉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,443評(píng)論 2 326
  • 正文 我和宋清朗相戀三年晋被,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刚盈。...
    茶點(diǎn)故事閱讀 38,563評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羡洛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扁掸,到底是詐尸還是另有隱情翘县,我是刑警寧澤,帶...
    沈念sama閱讀 34,251評(píng)論 4 328
  • 正文 年R本政府宣布谴分,位于F島的核電站锈麸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏牺蹄。R本人自食惡果不足惜忘伞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,827評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沙兰。 院中可真熱鬧氓奈,春花似錦、人聲如沸鼎天。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,712評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)斋射。三九已至育勺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罗岖,已是汗流浹背涧至。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,943評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桑包,地道東北人南蓬。 一個(gè)月前我還...
    沈念sama閱讀 46,240評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親赘方。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烧颖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,435評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 四、集合框架 1:String類:字符串(重點(diǎn)) (1)多個(gè)字符組成的一個(gè)序列蒜焊,叫字符串倒信。生活中很多數(shù)據(jù)的描述都采...
    佘大將軍閱讀 736評(píng)論 0 2
  • 一、基礎(chǔ)知識(shí):1泳梆、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,369評(píng)論 0 4
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,763評(píng)論 0 38
  • STL部分 1.STL為什么廣泛被使用 C++ STL 之所以得到廣泛的贊譽(yù)榜掌,也被很多人使用优妙,不只是提供了像vec...
    杰倫哎呦哎呦閱讀 4,315評(píng)論 0 9
  • hashmap實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),數(shù)組憎账、桶等套硼。 如圖所示 JDK 1.7,是以數(shù)組+鏈表組成的胞皱,鏈表為相同hash的鍵...
    不需要任何閱讀 820評(píng)論 0 1