分類

展開全部 | 收合全部

分類

展開全部 | 收合全部

【C++ 基礎語法 #7】C++ unorder_set() 用法筆記

前言

unorder_set() 作為一種 hashset 是一個滿經典的用法,
在 python 寫 set() 久了,換過來還真的有點不習慣,這裡稍微紀錄一下常見用法。

這裡只紀錄個人會常用到的用法,因此這裡「不會是完整的使用教學哦」(要完整請直接看文件)

初始化 unorder_set()

我們可以透過宣告一個 {},代表建立一個空的 set()

std::unordered_set<int> myset{};

insert,插入值進 unorder_set()

這邊留意一下 set 的特性,重複的值插入是「不會產生第二個」的

myset.insert(1);
myset.insert(2);
myset.insert(2);
myset.insert(3);

count,”單純” 確認元素存在

這裡我覺得很神奇,居然是用 count,
但 set 裡面最多就一個啊…. 是要 count 啥?

至少應該用 find? 不過 find 被另外拿去用了,下面會介紹, find 被拿去要來取出東西用的了

cout << "count 2 in myset = " << myset.count(2) << endl; // 1, 不會因為 insert 兩次變多
cout << "count 5 in myset = " << myset.count(5) << endl; // 1

find,尋找元素

find 與 count 的不同,就是 find 能幫我們拿到元素存在 set 的 iterator 位置,

cout << "find 2 in myset = " << *myset.find(2) << endl; // 透過 find 取得 iterator,並用 * 取得值

遍歷 unorder_set 中的元素

遍歷也很常需要用到,通常都是我自己 debug 的時候要看看有什麼…

這時就要呼叫我們的 iterator 了,然後就會感覺到程式變成超長又不好讀…

for (std::unordered_set<int>::iterator it = myset.begin(); it != myset.end(); it++) {
    cout << *it << endl;
}

C++ 11 以後的替代方案

謝天謝地的是,C++ 11 之後新增了 auto,可以幫我們處理掉前面那個看起來有點冗長的東西…

取而代之的就是,自己必須對 type 更加清楚,不然這會是個未來對 type 混亂災難性的開始…

把上面 type 的部分直接改成 auto 即可,
個人是認為雖然程式碼更簡潔了,但更考驗工程師對 type 的理解程度…

for (auto it = myset.begin(); it != myset.end(); it++) {
    cout << *it << endl;
}

完整範例程式碼

void exp_unordered_set(){
    std::unordered_set<int> myset{};
    myset.insert(1);
    myset.insert(2);
    myset.insert(2);
    myset.insert(3);

    cout << "find 2 in myset = " << myset.count(2) << endl;
    cout << "find 5 in myset = " << myset.count(5) << endl;

    for (std::unordered_set<int>::iterator it = myset.begin(); it != myset.end(); it++) {
        cout << *it << endl;
    }

    for (auto it = myset.begin(); it != myset.end(); it++) {
        cout << *it << endl;
    }
}
  • 結果:

Reference

⭐C++ 基礎用法 相關文章整理⭐:
1.【C++】C++ compile 程式碼 使用 c++ 11 與使用相關的 package
2.【C++】C/C++ 顯示資料的類別 (type) sample code (內含範例程式碼) print C data type, cout C++ data type, get variable type in c++
3.【C++】C++ 複製 2D array的方法 copy 2d array memcpy sample code (內含範例程式碼)
⭐Modern C++ ⭐:
⭐C++ 字串處理相關文章整理⭐:
1.【C++】字串 char string stringstream 相關用法總整理 (內含範例程式碼) 與利用 sprinf, snprinf assign 值的方法
2.【C++】字串 char string stringstream 「轉換」用法總整理 (內含範例程式碼)
3.【C】printf, fprintf, sprintf, snprintf 相關用法總整理 (內含範例程式碼)
4.【C++】C++ String 用法 連接兩個 String c++ string concat
⭐C++ 系統偵測相關文章整理⭐:
1.【C++】C++ 利用 dirent.h 計算資料夾的檔案數量 count files sample code (內含範例程式碼)
2.【C++】C++ inotify sample code 偵測指定路徑底下的文件變化 (內有範例程式碼)
⭐C++ OpenCV 相關文章整理⭐:
1.【OpenCV】c++ OpenCV – 在 ubuntu 上第一次執行 OpenCV 程式 sample code (內含範例程式碼)
2.【OpenCV】c++ OpenCV - 在圖片上寫上文字 cv::putText sample code (內含範例程式碼)
3.【OpenCV】c++ OpenCV - cv::Rect 矩形用法與相關功能函數 sample code (內含範例程式碼)
4.【OpenCV】c++ OpenCV - OpenCV 中的純量 定義顏色 cv::Scalar(255,255,255) color sample code (內含範例程式碼)
5.【OpenCV】用 C++ 計算 iou 的方法 與網路算法常見錯誤(內附範例程式碼) sample code
⭐C++ Makefile 相關文章整理⭐:
1.【C++ Makefile】- 1 / 嘗試撰寫自己的第一份 Makefile
2.【C++ Makefile】- 2 / 新增自己的變數
3.【C++ Makefile】- 3 / Makefile 常用變數 -「$@」, 「$^」
4.【C++ Makefile】- 4 / Makefile 常用 fake target -「.PHONY」
5.【C++ Makefile】- 5 / Makefile 內建變數 -「$@」, 「$^」, 「$<」, 「$* 」,「$? 」
⭐【喜歡我的文章嗎? 歡迎幫我按讚~ 讓基金會請創作者喝一杯咖啡!
如果喜歡我的文章,請幫我在下方【按五下Like】 (Google, Facebook 免註冊),會由 「LikeCoin」 贊助作者鼓勵繼續創作,讀者們「只需幫忙按讚,完全不用出錢」哦!

likecoin-steps
Howard Weng
Howard Weng

我是 Howard Weng,很多人叫我嗡嗡。這個網站放了我的各種筆記。希望這些筆記也能順便幫助到有需要的人們!如果文章有幫助到你的話,歡迎幫我點讚哦!
另外,因為定位是「個人的隨手筆記」,有些文章內容「⚠️可能我理解有誤⚠️」或「?只寫到一半?」,如果有發現這樣的情況,歡迎在該文章的最下面留言提醒我!我會儘快修正或補上!感謝大家的建議與幫忙,讓網站能變得更好?

文章: 889

★留個言吧!內容有誤或想要補充也歡迎與我討論!