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~~~。