1. 程式人生 > >C++抽象程式設計——STL(5)——set集合的基本輸入輸出

C++抽象程式設計——STL(5)——set集合的基本輸入輸出

the Set class

還有一個最有用的集合類,就是set(集合)類了,出口的方法如下圖,這個類我們用來模擬數學上的集合,也就是說這個類裡的元素是無序且其值只出現一次。set類在許多演算法應用中是極其有用的。所以我們應該從一些例項中去體驗和感受它們是怎麼工作以及為什麼在程式中如此有用。
先介紹一下set的常見的方法:

在這裡我們再也不是用我們熟悉的pop跟push(push_back)函式來放入或者是取出元素了,我們用insert跟erase函式來進行一些的新增跟刪除。
我們瞭解一下我們的常用方法吧:

方法 用法
插入刪除
insert(value) 向集合中插入一個元素
erase() 擦除元素中的一個或者一段元素
clear() 清除集合中的元素
查詢
find() 查詢value的值,返回下標位置,否則,返回最後一個元素後面一個位置(即迭代器的end)
容量
empty() 判斷集合是否為空
size() 返回集合中的元素個數
max_size() 返回集合的最大容量
迭代器
begin() 返回開頭的迭代器
end() 返回結尾的迭代器
rbegin() 反向遍歷的首個位置迭代器
rend() 反向遍歷的最後位置的迭代器

Implementing the library

我們先來試試這些集合可以幹什麼吧,我們之前提過一個功能很強大的字元處理標頭檔案,(詳情見: C++抽象程式設計——字串(3)——< cctype >庫在字串中的應用)想知道它是怎麼實現的嗎?具體的細節我們就不必要理解了,那麼我們要做的是瞭解它是怎麼樣的一個思路吧。
我們可以舉個例子,比如我們有個判斷是不是數字的方法
isdigit(ch)
實現起來很簡單:

bool isdigit(ch) {
return ch >= '0' && ch <= '9'
; }

但是使用者往往輸入的是一串的數字,所以我們可以建立一個集合,裡面的元素為{0,1,2,3,4,5,6,7,8,9},我們可以檢測ch在不在這個集合裡面。那麼我們沿著這個思路寫出大概的程式碼:

#include <iostream>
#include <set>
#include <cctype>
using namespace std;
/*將字串變為集合*/ 
set<char> setFromString(string str);
/*函式宣告*/
bool isFind(char ch, set<char> DIGIT_SET);
bool isFind(char ch, set<char> LOWER_SET);
bool isFind(char ch, set<char> UPPER_SET);
bool isFind(char ch, set<char> PUNCT_SET);
bool isFind(char ch, set<char> SPACE_SET);
bool isFind(char ch, set<char> XDIGIT_SET);
/*定義集合*/ 
set<char> DIGIT_SET = setFromString("0123456789");
set<char> LOWER_SET = setFromString("abcdefghijklmnopqrstuvwxyz");
set<char> UPPER_SET = setFromString("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
set<char> PUNCT_SET = setFromString("!\"#$%&'()*+,-./:;<=>[email protected][\\]^_‘{|}");
set<char> SPACE_SET = setFromString(" \t\v\f\n\r");
set<char> XDIGIT_SET = setFromString("0123456789ABCDEFabcdef");
/*定義函式*/ 
bool isdigit(char ch) { return isFind(ch, DIGIT_SET); }
bool islower(char ch) { return isFind(ch, LOWER_SET); }
bool ispunct(char ch) { return isFind(ch, PUNCT_SET); }
bool isspace(char ch) { return isFind(ch, SPACE_SET); }
bool isupper(char ch) { return isFind(ch, UPPER_SET); }
bool isxdigit(char ch) { return isFind(ch, XDIGIT_SET); } 

set<char> setFromString(string str) {
    set<char> set;
    for (int i = 0; i < str.length(); i++) {
    set.insert(str[i]);
    }
    return set;
}
/*判斷集合中是否存在該元素*/
bool isFind(char ch, set<char> DIGIT_SET) {
    set<char>::iterator it;
    it = DIGIT_SET.find(ch);
    if(it != DIGIT_SET.end()) return true;
    else return false;

}
......

在這裡我們注意,這個檔案我沒有寫main函式,所以是不能執行的。你可以自己新增main函式去試試這些功能。這裡的最後我用省略號省略了一系列的isFind函式,因為後面的函式只是最後的引數的名字改一下就可以了。最後我覺得set< char > setFromString(string str) 這個方法很好,我們可以參考這個改一下型別,比如vector類,我們就可以簡化輸入。
再認真看看最後的isFind函式,這裡有一行程式碼:

set<char>::iterator it;
    it = DIGIT_SET.find(ch);

iterator是一個迭代器,::為域運算子,所以就是說迭代器it是set< char >型別的迭代器,因為我們前面的DIGIT_SET.find()函式返回的是迭代器,不是一個數值。

set集合的輸入與輸出

我們還可以再舉例一個輸入輸出的簡單例子:
第一,先參考vector,試試輸出

先看看錯誤提示,no match for “operator[]”…,翻譯過來就是沒有匹配的[ ]運算子,那麼常規方法不行,我們就試試它提供的迭代器來完成

#include <iostream>
#include <set>
using namespace std;
int main(){
    set<int> s;
    set<int>::iterator it;
    for(int i = 0; i <= 9; i++){
        s.insert(i);
    }
    for(it = s.begin(); it != s.end(); it++) 
    cout << (*it) << " ";

    /* it = s.find(5);    /*查詢鍵值為5的元素*
    if(it != s.end()){    /*當it不為尾部的迭代器的時候,就找到了 
    cout << *it <<endl;
    }else{
    cout<<"不存在這個元素"; 
    }*/
    return 0;

}

輸出的結果如圖:

這裡我有一個地方註釋掉了,這裡面就是find方法的運用,我就不上圖了,有興趣就取消註釋來執行看看吧。接下來就介紹set的用途吧

相關推薦

C++抽象程式設計——STL5——set集合基本輸入輸出

the Set class 還有一個最有用的集合類,就是set(集合)類了,出口的方法如下圖,這個類我們用來模擬數學上的集合,也就是說這個類裡的元素是無序且其值只出現一次。set類在許多演算法應用中是極其有用的。所以我們應該從一些例項中去體驗和感受它們是怎麼工

C++抽象程式設計——字串1——字串運算

如今,我們雖然仍然把電腦稱為計算機,但是如今它處理的文字資訊卻遠遠多於我們的數字運算, 現代計算機處理文字資料的能力直接引領了簡訊,電子郵件,文書處理系統,線上參考庫(如百度百科),以及各種其他有用的應用程式的發展。這部分內容介紹了C++中的<string>庫,

C++傳智筆記5C++完整demo

內部 urn else clas spa char log getx system MyPoint.h #pragma once class MyPoint { private: double x0, y0; //點坐標 public: void setPoint(d

C程序設計導引5

宋體 span 格式 沒有 class div 第7章 限制 說了 第6章 數組 雖然數組放到很靠後的位置,但實際上它與int,double等在難度上沒有本質區別。我們可以把一個數組理解為一組格子,格子的名稱就是數組的名字。 定義一個一維數組的格式為: <類型>

C語言學習筆記5—— 語句1

  c程式常見結構大概有選擇結構,迴圈結構,順序結構。c程式由一個一個的函式構成,而構成函式的則是語句,語句包含賦值語句,迴圈語句,條件語句,分支語句。賦值語句對與我們來說是很熟悉的。條件語句,分支語句與迴圈語句則會在後面一一介紹到。   順序結構對於我們來說是很熟悉的,它可以是這個樣子。 &nbs

C語言學習筆記5—— 語句2

  在介紹過順序結構和選擇結構以後,我們能通過c語言做的事依舊很少,比如換硬幣問題。將一元的人民幣換成一分,兩分,五分的硬幣共50枚。如何解決這樣的問題呢?我們可以把它化解成一個求解線性方程組的問題。   可以設需要一分的硬幣x枚,兩分的硬幣y枚,五分的硬幣z枚。於是,我們可以得到一個方程組,像這樣:x+y

Python菜鳥快樂遊戲程式設計_pygame5

Python菜鳥快樂遊戲程式設計_pygame(博主錄製,2K解析度,超高清) https://study.163.com/course/courseMain.htm?courseId=1006188025&share=2&shareId=400000000398149  

Python語言程式設計基礎5—— 組合資料型別

tuple 元組(建立後不能修改) tuple = "cat","dog","tiger","human" print(tuple) def fun(x): return x,x*2 print(type(fun(3))) for x,y in ((2,0),(2,5),

Java程式設計思想5

第15章 泛型 1 泛型的例子 class Automobile{} public class ArrayApp<T> { private T a; public ArrayApp(T a){ this.a = a; } public void set(T a){

我與C語言的點滴5-迴圈3選擇

猜數字遊戲 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> void menu() {

C++ 非同步程式設計探索 thread safe

前言 在非同步程式設計實踐中,曾經遇到的最大的問題就是thread safe 問題。 我所在的團隊是Database團隊,主要是為APP提供和redis互動的API。場景就是application thread呼叫我們的API。我們有個worker thread

C++ 非同步程式設計探索 task鏈式排程 -- future CONTINUATION

同步Vs非同步程式設計, 一直是大家討論的熱點。 同步程式設計以其邏輯簡單,受到了一些對時間不敏感的程式青睞,而非同步程式設計以其高效深受處女座程式設計師喜愛。 作為一隻處女座程式猿,當然要非同步非同步非同步。。。 說到非同步, C++11之前, 用的最多的就是

C語言程式設計練習

問題描述:.給出一個英語句子,希望你把句子裡的單詞順序都翻轉過來     輸入樣例:I love you    輸出樣例:you love I  1 /**********************************************************

Boost.Asio c++ 網路程式設計翻譯30[完結]

本地socket是一種只能被執行在主機上的應用訪問的socket。你可以使用本地socket來實現簡單的程序間通訊。你可以用客戶端或者服務端的方式來連線兩端。對於本地socket,端點時一個檔案,比如/tmp/whatever。很酷的一件事情是你可以給指定的檔案賦予許可權,從而禁止機器上指定的使用者在檔案上建

C++進修之STL—— erase和remove特異行動

1: // 2: //Source code originally MSDN Channel 9 Video 3: //Modified by techmush 4: //NOTE: the original code may be perfect, the modified ver

c# opencvsharp學習筆記5CvTrackbar,HSV,通道分割合併

1.CvTrackbarpublic CvTrackbar(string name, string window, CvTrackbarCallback callback); public CvTrackbar(string name, string window, CvTr

深度探索C++物件模型——物件5——程式轉化語義

我們寫的程式碼,編譯器會對程式碼進行拆分,拆分成編譯器更容易理解和實現的程式碼,接下來將從我們程式設計師寫程式碼角度和編譯器理解角度去分析一些情況 1.定義時初始化物件 (1)程式設計師角度 #include <iostream> using namespace std;

linux下C語言程式設計日誌1:基於TCP協議的伺服器/客戶端程式

  基於TCP協議的伺服器/客戶端程式  首先我們看一下使用TCP協議進行網路通訊的程式基本模型:伺服器首先進行初始化操作:呼叫函式socket建立一個套接字,函式bind將這個套接字與伺服器的公認地址繫結在一起,函式listen將這個套接字換成傾聽套接字,然後呼叫函式acc

matlab和C/C++混合程式設計--Mex 引數傳遞

最近的專案需要matlab和C的混合程式設計,經過一番努力終於完成了專案要解決的問題。現在就將Mex的一些經驗總結一下,當然只是剛剛開始,以後隨著學習的深入繼續新增。首先講講寫Mex的一些常規規定,然後我們會重點關注混合程式設計中最難解決資料的問題--結構到底如何轉換

【杭電100題】C語言程式設計練習2014 青年歌手大獎賽_評委會打分

http://acm.hdu.edu.cn/showproblem.php?pid=2014Problem Description青年歌手大獎賽中,評委會給參賽選手打分。選手得分規則為去掉一個最高分和一個最低分,然後計算平均得分,請程式設計輸出某選手的得分。Input輸入資料