Python sys.argv 用法

本篇介紹 Python sys.argv 用法,sys.argv 是用來取得執行 Python 檔案時命令列參數的方法。

sys.argv 其實就是個 list,除了sys.argv[0]以外,sys.argv 裡面存放著執行程式時帶入的外部參數,
在 Python 中要取得像 c 語言的 argc 的話,就直接計算 sys.argv 的長度即可。

要使用 sys.argv 前記得要先import sys 才可順利使用。

Python sys.argv 範例

以下為簡單的 Python sys.argv 範例,假設執行這個 Python 程式至少要傳入一個或以上的命令列參數的話,我們可以用 len(sys.argv) 來判斷使用者輸入了幾個命令列參數,不符合預期就顯示錯誤訊息並且用 sys.exit() 來結束程式。

Python-sys-argv.py
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys

if __name__ == '__main__':
if len(sys.argv) < 2:
print('no argument')
sys.exit()
print('hello')
print(sys.argv[0])
print(sys.argv[1])

印出參數有幾個:print(len(sys.argv)),像 c 語言的 argc 一樣
印出檔案名稱:print(sys.argv[0]),也就是執行的 Python 本身檔案名稱
印出第一個參數:print(sys.argv[1])
印出第二個參數:print(sys.argv[2])
印出所有參數:print(sys.argv),也就是印出 sys.argv list

這邊測試一下這個程式的執行結果,執行 Python-sys-argv.py 時傳入 123 參數,輸出如下:

1
2
3
4
$ ./Python-sys-argv.py 123
hello
./Python-sys-argv.py
123

如果要解析更複雜參數的話,建議使用 argparse 模組的方式,可以省掉很多自己處理的部份。

以上就是 Python sys.argv 用法介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

參考
Python中sys.argv的用法_张康的博客-CSDN博客
https://blog.csdn.net/csdn15698845876/article/details/74909089
sys — 你所不知道的 Python 標準函式庫用法 01 | louie_lu’s blog
https://blog.louie.lu/2017/07/26/%E4%BD%A0%E6%89%80%E4%B8%8D%E7%9F%A5%E9%81%93%E7%9A%84-python-%E6%A8%99%E6%BA%96%E5%87%BD%E5%BC%8F%E5%BA%AB%E7%94%A8%E6%B3%95-01-sys/

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python 新手入門教學懶人包
Python str 字串用法與範例
Python list 串列用法與範例
Python set 集合用法與範例
Python dict 字典用法與範例
Python tuple 元組用法與範例

C/C++ 三元運算子

介紹 C/C++ 三元運算子的用法,在 C/C++ 使用三元運算子(ternary operator) 好處是程式碼可以看起來比較簡短,
在某些情況 C/C++ 使用三元運算子簡化後程式碼會變得簡潔許多。

C/C++ 三元運算子語法

什麼是三元運算子(ternary operator),簡單說它是 if … else … 的精簡版,
語法如下:

1
條件式 ? 條件式為true時執行的陳述句 : 條件式為false時執行的陳述句

C/C++ 三元運算子範例

上面語法看不懂也沒關係,馬上直接看例子吧!
一般寫 if … else … 的例子如下:

1
2
3
4
5
6
int ret, a = 10, b = 11;
bool flag = true;
if (flag)
ret = a;
else
ret = b;

等價於

1
ret = flag ? a : b;

以上就是是 C/C++ 的三元運算子寫法,
馬上就把程式碼縮短成一行,簡單明瞭,第一次寫的時候會不習慣,看久了後就習慣了。
接下來將提供 C/C++ 更多使用三元運算子的情境,讓你在程式碼中更靈活地處理條件判斷。

C/C++ 三元運算子範例:判斷是正數、負數或零

這裡有另一個使用三元運算子的範例,這次是用來確定一個數字是正數、負數還是零,

1
2
3
4
5
6
7
8
9
10
#include <iostream>

int main() {
int number = 10;

// 使用三元運算子判斷數字的正負性
std::cout << "數字是 " << ((number > 0) ? "正數" : (number < 0) ? "負數" : "零") << std::endl;

return 0;
}

C/C++ 三元運算子範例:兩數取最大值

當 C/C++ 需要找出兩個數字中的最大值時,使用三元運算子更加簡單。以下是一個找出兩個數字最大值的範例,在這個例子中,findMax 函式接受兩個整數參數,並使用三元運算子來找出最大值,

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>

int findMax(int num1, int num2) {
return (num1 > num2) ? num1 : num2;
}

int main() {

std::cout << findMax(1, 2) << std::endl;
std::cout << findMax(4, 3) << std::endl;

return 0;
}

輸出結果如下:

1
2
2
4

也可以將 findMax 函式寫成 MAX 巨集,運用三元運算子的技巧,

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>

#define MAX(x, y) ((x) > (y) ? (x) : (y))

int main() {
// 使用巨集找出最大值
int maxNumber = MAX(5, 2);

std::cout << "最大的數字是: " << maxNumber << std::endl;

return 0;
}

輸出結果如下:

1
最大的數字是: 5

C/C++ 三元運算子範例:判斷奇偶數

以下是 C/C++ 使用三元運算子判斷一個數字是奇數還是偶數的簡單範例,在這個例子中,使用了餘數運算符 % 來判斷一個數字是否能被2整除,如果能整除的話,則是偶數,反之則是奇數,

1
2
3
4
5
6
7
8
9
10
#include <iostream>

int main() {
int number = 5;

// 使用三元運算子判斷奇偶數
std::cout << "數字是 " << ((number % 2 == 0) ? "偶數" : "奇數") << std::endl;

return 0;
}

輸出結果如下:

1
數字是 奇數

以上就是 C/C++ 三元運算子介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

參考
C conditional operators - C Programming - c4learn.com
http://www.c4learn.com/c-programming/c-conditional-operators/
三元運算元使用時機|Ternary operators vs if-else statemanet - Cat for Code.
https://catforcode.com/ternary-operators/
C/C++ Ternary Operator - Some Interesting Observations - GeeksforGeeks
https://www.geeksforgeeks.org/cc-ternary-operator-some-interesting-observations/

其它相關文章推薦
C/C++ 新手入門教學懶人包

在 Mac OSX 用 cmake 專案寫 Boost 程式

本篇介紹在 Mac OSX 下使用 cmake 來寫 boost C++ 的程式。

以下為我的系統環境:
作業系統:Mac OSX 10.13.4
編譯器:Apple LLVM version 9.0.0 (clang-900.0.38)
cmake 3.4.3
使用版本:boost 1.67.0

安裝 boost

還沒安裝 boost 的話請參考 windows 安裝方式 / ubuntu 安裝方式

使用範例

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <boost/filesystem.hpp>

using namespace std;
using namespace boost::filesystem;

int main(int argc, const char *argv[])
{
create_directories("image/out");
return 0;
}

cmake 專案怎麼寫如下所示,
add_executable:來定義執行檔名稱,
include_directories
target_link_libraries

CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cmake_minimum_required(VERSION 3.0)

set(BOOST_ROOT /usr/local/include/boost)
#set(BOOST_INCLUDEDIR /usr/local/include/boost)
#set(BOOST_LIBRARYDIR /usr/local/xxx)

find_package(Boost REQUIRED COMPONENTS system)
if(Boost_FOUND)
MESSAGE(STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}")
MESSAGE(STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}")
MESSAGE(STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}")

include_directories(${Boost_INCLUDE_DIRS})
add_executable(a.out boost-filesystem-create-directory.cpp)
target_link_libraries(a.out ${Boost_LIBRARIES})
endif()

編譯

在 macosx 使用 cmake 來編譯的指令如下:

1
2
3
$ mkdir build && cd build
$ cmake ..
$ make

查看 boost 版本號

1
2
$ cat /usr/local/include/boost/version.hpp | grep BOOST_VERSION
#define BOOST_VERSION 106700

參考
[1] FindBoost — CMake 3.16.2 Documentation
https://cmake.org/cmake/help/v3.16/module/FindBoost.html
[2] Linux下使用CMake进行编译的时候寻找Boost库 - 简书
https://www.jianshu.com/p/1827cd86d576

在 Ubuntu 用 cmake 專案寫 Boost 程式

本篇介紹在 Ubuntu 下使用 cmake 來寫 boost C++ 的程式。

以下為我的系統環境:
作業系統:Ubuntu 16.04
編譯器:G++ 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.11)
cmake 3.5.1
使用版本:boost 1.71.0

安裝 boost

還沒安裝 boost 的話請參考 windows 安裝方式 / ubuntu 安裝方式

使用範例

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <boost/filesystem.hpp>

using namespace std;
using namespace boost::filesystem;

int main(int argc, const char *argv[])
{
create_directories("image/out");
return 0;
}

cmake 專案怎麼寫如下所示,
add_executable:來定義執行檔名稱,
include_directories
target_link_libraries

CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cmake_minimum_required(VERSION 3.0)

set(BOOST_ROOT /usr/local/include/boost)
#set(BOOST_INCLUDEDIR /usr/local/include/boost)
#set(BOOST_LIBRARYDIR /usr/local/xxx)

find_package(Boost REQUIRED COMPONENTS system)
if(Boost_FOUND)
MESSAGE(STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}")
MESSAGE(STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}")
MESSAGE(STATUS "Boost_VERSION = ${Boost_VERSION}")
MESSAGE(STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}")

include_directories(${Boost_INCLUDE_DIRS})
add_executable(a.out boost-filesystem-create-directory.cpp)
target_link_libraries(a.out ${Boost_LIBRARIES})
endif()

編譯

在 linux 使用 cmake 來編譯的指令如下:

1
2
3
$ mkdir build && cd build
$ cmake ..
$ make

查看 boost 版本號

1
2
$ cat /usr/local/include/boost/version.hpp | grep BOOST_VERSION
#define BOOST_VERSION 107100

參考
[1] FindBoost — CMake 3.16.2 Documentation
https://cmake.org/cmake/help/v3.16/module/FindBoost.html
[2] Linux下使用CMake进行编译的时候寻找Boost库 - 简书
https://www.jianshu.com/p/1827cd86d576

boost::interprocess 共享記憶體 shared memory

本篇介紹使用 boost C++ 的 interprocess 模組來做IPC行程通訊,內容包含了 boost::interprocess::managed_shared_memory 的用法。

安裝 boost

還沒安裝 boost 的話請參考 windows 安裝方式 / ubuntu 安裝方式

使用範例

boost-interprocess-shared-memory.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// g++ boost-interprocess-shared-memory.cpp -o a.out -pthread -lrt
#include <iostream>
#include <boost/interprocess/managed_shared_memory.hpp>

using namespace boost::interprocess;

int main(int argc, const char *argv[])
{
// 先刪除
bool ret = shared_memory_object::remove("Boost_shm");
std::cout << std::boolalpha << ret << std::endl;
// 建立 managed shared memory
managed_shared_memory managed_shm(open_or_create, "Boost_shm", 1024);
int *i = managed_shm.construct<int>("Integer")(100);
std::cout << *i << '\n';
// 按名字讀取
std::pair<int *, std::size_t> p = managed_shm.find<int>("Integer");
if (p.first)
std::cout << *p.first << std::endl;

return 0;
}

編譯

linux
在 linux 下用 g++ 編譯需要連結 pthread 與 rt。

1
$ g++ boost-interprocess-shared-memory.cpp -o a.out -pthread -lrt

連結 pthread 是因為 boost 內部實作時使用到了 pthread_mutexattr_init、pthread_mutexattr_setpshared、pthread_mutexattr_settype、pthread_mutexattr_destroy 等函式。
連結 rt 是因為 boost 內部實作時使用到了 shm_open、shm_unlink 等函式。
Boost.Interprocess 不用編譯,它是 header only library,只要將你的 Boost header 的目錄加入編譯器的 include path 即可。
Boost.Interprocess 是依賴於 Boost.DateTime

windows
在 windows 下用 visual studio 編譯不連結 DateTime 的函式庫的話記得加 BOOST_DATE_TIME_NO_LIB,要加在 boost/interprocess/*.hpp 前才有意義。

1
2
#define BOOST_DATE_TIME_NO_LIB
#include <boost/interprocess/managed_shared_memory.hpp>

參考
Chapter 33. Boost.Interprocess - Managed Shared Memory
https://theboostcpplibraries.com/boost.interprocess-managed-shared-memory
boost::interprocess 共享内存 - 作业部落 Cmd Markdown 编辑阅读器
https://www.zybuluo.com/Pigmon/note/1376783


Chapter 17. Boost.Interprocess - 1.66.0
https://www.boost.org/doc/libs/1_66_0/doc/html/interprocess.html
c++ - Is boost::managed_shared_memory using a file on my hard drive? - Stack Overflow
https://stackoverflow.com/questions/58487479/is-boostmanaged-shared-memory-using-a-file-on-my-hard-drive
Highscore - Boost C++ 库 - 进程间通讯
http://zh.highscore.de/cpp/boost/interprocesscommunication.html
Boost IPC共享内存的使用总结 - lday的个人页面 - OSCHINA
https://my.oschina.net/lday/blog/724458
Boost.Interprocess使用手册翻译之二:快速指南 (Quick Guide for the Impatient)_great3779的专栏-CSDN博客
https://blog.csdn.net/great3779/article/details/7222202

boost::filesystem 建立資料夾

本篇介紹使用 boost C++ 的 filesystem 模組來建立資料夾。

幾年前為了寫 C++ 跨平台程式,研究了一下怎麼用 boost 的 filesystem 模組來完成這個功能,最近在整理 boost 的筆記就順便記錄下來吧!
這個功能最新的 C++17 也已經加入這個功能了,相信再過幾年就很普及了。

安裝 boost

還沒安裝 boost 的話請參考 windows 安裝方式 / ubuntu 安裝方式

使用範例

可以一次建立多層資料夾目錄

boost-filesystem-create-directory.cpp
1
2
3
4
5
6
7
8
9
10
11
12
// g++ boost-filesystem-create-directory.cpp -o a.out -lboost_filesystem
#include <iostream>
#include <boost/filesystem.hpp>

using namespace std;
using namespace boost::filesystem;

int main(int argc, const char *argv[])
{
create_directories("image/out");
return 0;
}

編譯

在 linux 下使用 g++ 編譯需要連結 boost_filesystem 函式庫

1
$ g++ boost-filesystem-create-directory.cpp -o a.out -lboost_filesystem

參考
[1] Filesystem Tutorial 1.47.0
http://www.boost.org/doc/libs/1_47_0/libs/filesystem/v3/doc/tutorial.html
[2] Filesystem Tutorial 1.66.0
https://www.boost.org/doc/libs/1_66_0/libs/filesystem/doc/tutorial.html
[3] C++ 檔案、資料夾、路徑處理函式庫:boost::filesystem
https://kheresy.wordpress.com/2010/10/25/boost_filesystem/

在 Windows 用 cmake 產生 Visual Studio 專案寫 Boost 程式

本篇 ShengYu 將介紹如何在 Windows 用 cmake 產生 Visual Studio 專案寫 Boost 程式,Windows 怎麼安裝 boost 請看這篇,確定系統有安裝 boost 後,就開始動手寫程式吧!

用 cmake 來建立 Visual Studio 專案

要讓 cmake 能夠使用 boost,要先設定 BOOST_ROOT、BOOST_INCLUDEDIR、BOOST_LIBRARYDIR 三個變數才能順利找到 boost 的路徑與 cmake 相關變數
可以在下 cmake 時後面帶參數,也可以在CMakeList.txt裡用 set 設定。
這邊會用到的變數為 BOOST_ROOT、BOOST_INCLUDEDIR、BOOST_LIBRARYDIR,最後可在 CMakeList.txt 裡 確認Boost_FOUND 這個變數看看有沒有找到 Boost。

1
2
3
4
5
cmake .. \
-G "Visual Studio 14 2015 Win64" \
-DBOOST_ROOT:PATH=C:/osvr/boost_1_66_0 \
-DBOOST_INCLUDEDIR:PATH=C:/osvr/boost_1_66_0 \
-DBOOST_LIBRARYDIR:PATH=C:/osvr/boost_1_66_0/libs

補充︰我使用到 cmake 版本是3.xx,按照它內部的 FindBoost.cmake 來看只能找到1.70以下

寫專案的 CMakeList.txt

CMakeList.txt project 使用 Boost_INCLUDE_DIRS、Boost_LIBRARIES變數。

1
2
3
4
5
6
find_package(Boost 1.66.0 COMPONENTS date_time filesystem system ...)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(foo foo.cc)
target_link_libraries(foo ${Boost_LIBRARIES})
endif()

寫一個簡單的 Boost 程式

boost_example.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
using namespace boost::lambda;
typedef std::istream_iterator<int> in;

std::for_each(
in(std::cin), in(), std::cout << (_1 * 3) << " " );
}

執行程式

1
echo 1 2 3 | ./boost_example

結果輸出如下:

1
3 6 9

參考
[1] FindBoost — CMake 3.16.2 Documentation
https://cmake.org/cmake/help/v3.16/module/FindBoost.html
[2] CMake/FindBoost.cmake at master · Kitware/CMake · GitHub
https://github.com/Kitware/CMake/blob/master/Modules/FindBoost.cmake

在 Windows 下安裝 Boost

Boost C++ Libraries 是 C++ 開發利器,在 Windows 下安裝 Boost 的方式有兩種,第一種是下載使用官方預編譯好的 Boost 函式庫,第二種是使用原始碼編譯安裝 Boost。

以下為我的系統環境:
作業系統:Windows 10
Visual Studio 2017 (msvc-14.1)
Visual Studio 2015 (msvc-14.0)
cmake 3.16.2 以後的版本才比較能順利的找到 boost 1.70.0
使用版本:boost 1.66.0

方法1. 下載使用官方預編譯好的 Boost 函式庫來安裝

官方預編譯好的 Boost 函式庫請到這裏下載,
Visual Studio 2017 下載 boost_1_66_0-msvc-14.1-32.exe / boost_1_66_0-msvc-14.1-64.exe
Visual Studio 2015 下載 boost_1_66_0-msvc-14.0-32.exe / boost_1_66_0-msvc-14.0-64.exe
所有的版本下載boost_1_66_0-bin-msvc-all-32-64.7z

方法2. 下載原始碼編譯與安裝

Windows 請看 在 Windows 下編譯安裝 Boost 1.70.0 這篇
Ubuntu 請看 在 Ubuntu 下編譯安裝 Boost 1.70.0 這篇

安裝完 Boost 環境後馬上就開始來寫第一支 Boost 程式吧~

相關主題
在 Ubuntu 下安裝 Boost

在 Ubuntu 下安裝 Boost

Boost C++ Libraries 是 C++ 開發利器,在 Ubuntu 下安裝 Boost 的方式有兩種,第一種是透過 apt 來安裝 Boost,第二種是用原始碼編譯安裝 Boost。

以下為我的系統環境:
作業系統:Ubuntu 16.04

方法1. 使用 apt 套件安裝

Ubuntu 16.04 透過 apt 會安裝 boost 1.58.0,如何知道 apt 安裝會安裝到什麼版本可以用 apt-cache search libboost-all-dev 搜尋到相關資訊。apt 安裝 boost 的指令如下:

1
sudo apt-get install libboost-all-dev

方法2. 下載原始碼編譯與安裝

Ubuntu 請看 在 Ubuntu 下編譯安裝 Boost 1.70.0 這篇
Windows 請看 在 Windows 下編譯安裝 Boost 1.70.0 這篇

安裝完 Boost 環境後馬上就開始來寫第一支 Boost 程式吧~

相關主題
在 Windows 下安裝 Boost

參考
How to install latest Boost library on Raspberry Pi
http://osdevlab.blogspot.tw/2016/02/how-to-install-latest-boost-library-on.html

std::random_shuffle 產生不重複的隨機亂數

本篇介紹 C++ 的 std::random_shuffle 用法,並使用 std::random_shuffle 來產生不重複的隨機亂數,在一些情形下很需要使用到不重複的隨機亂數,趕快來學習吧。

實際應用案例

之前用 Qt 寫音樂播放器時,要實現隨機播下一首的功能,
就需用產生不重複的隨機亂數,這樣每次下一首個才會不重複到,就順便記錄下來吧。

需要引入的標頭檔<algorithm>

使用範例

std-random_shuffle.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// g++ std-random_shuffle.cpp -o a.out -std=c++11
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <chrono>

using namespace std;

int myrandom (int i) { return std::rand() % i; }

int main() {

vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

cout << "list : ";
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
cout << endl;

//std::srand(unsigned(std::time(0)));
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::srand(seed);

// 方法1 沒使用std::srand的話每次亂數結果都一樣
std::random_shuffle(vec.begin(), vec.end()); // using built-in random generator

// 方法2 沒使用std::srand的話每次亂數結果都一樣
//std::random_shuffle(vec.begin(), vec.end(), myrandom);

//default_random_engine defaultEngine; // 沒帶入種子的話每次亂數結果都一樣
//std::shuffle(vec.begin(), vec.end(), defaultEngine);

// 方法3, 使用系統時鐘作為種子
//unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
//std::shuffle(vec.begin(), vec.end(), std::default_random_engine(seed));

// 方法4
//std::random_device rd;
//std::shuffle(vec.begin(), vec.end(), std::default_random_engine(rd()));

// 方法5
//std::random_device rd;
//std::mt19937 g(rd());
//std::shuffle(vec.begin(), vec.end(), g);

cout << "result: ";
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
cout << endl;

return 0;
}

輸出

1
2
list  : 1 2 3 4 5 6 7 8 9 10 
result: 6 4 1 3 2 7 10 8 5 9

參考
[1] std::random_shuffle, std::shuffle - cppreference.com
https://en.cppreference.com/w/cpp/algorithm/random_shuffle
[2] random_shuffle - C++ Reference
http://www.cplusplus.com/reference/algorithm/random_shuffle/
[3]【C++ STL应用与实现】64: 如何使用shuffle和random_shuffle : 洗牌 (since C++11)
https://elloop.github.io/c++/2015-12-24/learning-using-stl-5-std-shuffle
[4] C++11 的 Random library, 你還在用rand()嗎? | Chino’s
http://chino.taipei/note-2016-1020C-11-%E7%9A%84-Random-library-%E4%BD%A0%E9%82%84%E5%9C%A8%E7%94%A8rand-%E5%97%8E/

其它相關文章推薦
C/C++ 新手入門教學懶人包
std::thread 用法與範例
std::deque 用法與範例
std::find 用法與範例
std::mutex 用法與範例
std::unordered_map 用法與範例
std::sort 用法與範例
std::shared_ptr 用法與範例
std::async 用法與範例