C++STL標準庫學習筆記(五)set
前言:
在這個筆記中,我把大多數程式碼都加了注釋,我的一些想法和註解用藍色字體標記了出來,重點和需要關注的地方用紅色字體標記了出來,這一篇後面主要都是我的記錄了,為了防止大片藍色字體出現,後面就不改藍色了。
在上篇部落格的時候就在想multiset去掉multi會是啥,然後就來到了這一節,set。
1.1 set的作用
set和multiset的區別在於容器內不能有重複元素
a和b重複等價於「a必須排在b前面」和「b必須排在a前面」都不成立。這都強調多少次了,不過每一次都不一樣就是了,這裡是重複,之前是相等以及排序。
set插入元素可能不成功
使用時同樣要注意#include<set>
1.2 set的用法
也先給上程式碼樣例:


1 #include<iostream> 2 #include<cstring> 3 #include<set> 4 using namespace std; 5 6 int main(int argc, char const *argv[]) 7 { 8 set<int> st; 9 int a[10] = {1,2,3,8,7,7,5,6,8,12}; 10 for (int i = 0; i < 10; i++) 11 { 12 st.insert(a[i]); 13 } 14 cout<<st.size()<<endl;//結果:8 15 //這裡就是set的特色所在了,7和7,8和8重複了,只留下了一個7和一個8 16 set<int>::iterator i; 17 for ( i = st.begin(); i != st.end(); i++) 18 { 19 cout<<*i<<",";//結果:1,2,3,5,6,7,8,12, 20 }//沒有重複元素 21 cout<<endl; 22 pair<set<int>::iterator,bool>result = st.insert(2); 23 //我試了下,這個insert的返回值也是pair類型,first是 24 //iterator,second是bool,所以說不能調換位置。 25 /* 26 pair<set<int>::iterator,bool> 27 等價於 28 struct 29 { 30 set<int>::iterator first; 31 bool second; 32 } 33 */ 34 if (!result.second)//條件成立說明插入不成功 35 {//此時first這個迭代器就會指向那個重複的元素 36 cout<<*result.first<<" already exists."<<endl; 37 } 38 else 39 { 40 cout<<*result.first<<" inserted."<<endl; 41 }//結果:2 already exists. 42 return 0; 43 }
樣例
老樣子,我們從程式碼里找出有用的地方來簡單介紹。
1、set的建立:
set<int> st;
st.insert(a[i]);
這個插入就會體現出set的特色了,樣例中插入了10個元素,輸出st.size()時卻只有8的大小,這是因為輸入了兩個7和兩個8,因為重複,所以插入♂不了了。
2、pair<T1,T2>的使用
我們在程式中使用了pair<set<int>::iterator,bool>result = st.insert(2);來讓result這個pair類型變數接收insert()的返回值,那麼pair是什麼呢?
在這個地方:
pair<set<int>::iterator,bool>
等價於:
1 struct 2 { 3 set<int>::iterator first; 4 bool second; 5 }result;
而:
pair<T1,T2>類型等價於:
1 struct 2 { 3 T1 first; 4 T2 second; 5 };
例如:pair<int, double>a;
等價於:
1 struct 2 { 3 int first; 4 double second; 5 }a; 6 a.first = 1; 7 a.second = 93.93;
最後補充一下:
剛剛調試了一下發現insert()的返回值是pair類型,其中first是iterator類型,指向已經插入了的那個值的位置,second是bool類型,用於回饋插入是否成功。成功和失敗都會用迭代器返回值的位置,成功時second的值為true,失敗時為false,可以拿上面樣例改個數字進行調試而知道這個結果。順帶一提,first和second調換先後會報錯,就是說不能pair<bool,set<T>::iterator>來接受insert()的返回值。(本來覺得它挺智慧的,其實也就那樣哈哈哈)
後記:
這裡主要介紹了set和pair的用法,不知道STL標準庫還有多少多少東西可以研究(挺有意思的),老師推薦了一本書《C++標準庫》,等書到了我就去把一些常用的STL標準庫中的東東做成筆記扔進部落格。感謝大家讀到這裡,祝大家青春永駐,byebye~~~。