C++ std::pair 用法與範例

本篇 ShengYu 介紹 C++ std::pair 用法與範例,std::pair 是 C++ 標準函式庫中的一個類範本,用於將兩個值捆綁在一起,形成一個有序的對(pair)。std::pair 是一個非常有用的工具,特別是用於將兩個不同類型的值關聯在一起,以便一起傳遞、返回或儲存。接下來看看 std::pair 用法範例。

要使用 std::pair 的話,需要引入的標頭檔: <utility>

C++ 建立 std::pair

以下是 C++ 建立 std::pair 的用法,

std-pair.cpp
1
2
3
4
5
6
7
8
9
// g++ std-pair.cpp -o a.out
#include <iostream>
#include <utility>

int main() {
// 建立一個 std::pair 對象,將整數和字串關聯在一起
std::pair<int, std::string> myPair(100, "Tom");
return 0;
}

訪問 std::pair 中的元素

你可以使用 firstsecond 成員來訪問 std::pair 中的第一個和第二個元素,

std-pair2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// g++ std-pair2.cpp -o a.out
#include <iostream>
#include <utility>

int main() {
std::pair<int, std::string> myPair(100, "Tom");
std::cout << myPair.first << "\n";
std::cout << myPair.second << "\n";

int firstValue = myPair.first; // 取得第一個元素的值
std::string secondValue = myPair.second; // 取得第二個元素的值
std::cout << firstValue << "\n";
std::cout << secondValue << "\n";

return 0;
}

輸出如下:

1
2
3
4
100
Tom
100
Tom

使用 std::make_pair 建立 std::pair

std::make_pair 是一個方便的函數,用來建立 std::pair,它可以自動推斷元素的類型,

std-pair3.cpp
1
2
3
4
5
6
7
8
9
10
11
// g++ std-pair3.cpp -o a.out
#include <iostream>
#include <utility>

int main() {
auto anotherPair = std::make_pair(3.14, "Hello World");
std::cout << anotherPair.first << "\n";
std::cout << anotherPair.second << "\n";

return 0;
}

輸出如下:

1
2
3.14
Hello World

比較 std::pair

std::pair 支援比較運算子,你可以使用 ==, !=, <, >, <=, 和 >= 來比較兩個 std::pair 對象,

std-pair4.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// g++ std-pair4.cpp -o a.out
#include <iostream>
#include <utility>

int main() {
std::pair<int, std::string> pair1(100, "Tom");
std::pair<int, std::string> pair2(100, "Tom");

if (pair1 == pair2) {
std::cout << "相等\n";
} else {
std::cout << "不相等\n";
}

return 0;
}

輸出如下:

1
相等

使用 std::pair 在容器中儲存關聯資料

std::pair 可以用來在容器中儲存關聯的資料。例如,你可以使用 std::pairstd::vector 中儲存 key-value 對。

std-pair5.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// g++ std-pair5.cpp -o a.out
#include <iostream>
#include <utility>
#include <vector>

int main() {
std::vector<std::pair<int, std::string>> keyValuePairs;
keyValuePairs.push_back(std::make_pair(1, "One"));
keyValuePairs.push_back(std::make_pair(2, "Two"));
keyValuePairs.push_back(std::make_pair(3, "Three"));

for (int i = 0; i < keyValuePairs.size(); i++) {
std::cout << "key: " << keyValuePairs[i].first
<< ", value: " << keyValuePairs[i].second << "\n";
}

return 0;
}

輸出如下:

1
2
3
key: 1, value: One
key: 2, value: Two
key: 3, value: Three

使用 tie 取得回傳 std::pair 的元素值

在某些情況函式回傳 std::pair 時,可以使用 std::tie 來接收,這樣可以直接用變數接收 std::pair 的元素值,要用 std::tie 的話要引用 tuple 的標頭檔 <tuple>

std-pair6.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// g++ std-pair6.cpp -o a.out
#include <iostream>
#include <utility>
#include <vector>
#include <tuple>

std::pair<int, std::string> getStudent() {
return std::make_pair(100, "Tom");
}

int main() {
int id;
std::string name;

std::tie(id, name) = getStudent();

std::cout << "id: " << id << ", name: " << name << "\n";

return 0;
}

輸出如下:

1
id: 100, name: Tom

以上就是 C++ std::pair 用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
C/C++ 新手入門教學懶人包
std::string 用法與範例
std::vector 用法與範例
std::sort 用法與範例
std::map 用法與範例
std::set 用法與範例

C++ std::array 用法與範例

本篇 ShengYu 介紹 C++ std::array 用法與範例,std::array 是 C++ 標準函式庫提供的一個容器,用於表示固定大小的陣列。可以代替傳統的 C 陣列,它在某些情況下比傳統的 C 陣列更具優勢,因為它提供了更好的性能、更多的安全性與功能。接下來看看 std::array 用法範例。

要使用 std::array 的話,需要引入的標頭檔: <array>

C++ 建立 std::array

C++ std::array 的大小在建立時就被固定了,無法改變。這意味著它既提供了陣列的效率,又提供了容器的安全性。
你可以使用不同的方法來建立 std::array,範例如下,

std-array.cpp
1
2
3
4
5
6
7
8
9
10
// g++ std-array.cpp -o a.out
#include <iostream>
#include <array>

int main() {
std::array<int, 3> myArray; // 建立一個包含3個整數的陣列
std::array<double, 3> anotherArray = {1.1, 2.2, 3.3}; // 建立並初始化陣列

return 0;
}

訪問 std::array 元素

使用 [] 運算子來訪問該 std::array 的元素,

std-array2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// g++ std-array2.cpp -o a.out
#include <iostream>
#include <array>

int main() {
std::array<int, 3> myArray = {1, 2, 3};

int value = myArray[2]; // 訪問第三個元素(索引為2)
std::cout << value << "\n";

for (int i = 0; i < myArray.size(); i++) {
std::cout << myArray[i] << "\n";
}

return 0;
}

輸出如下:

1
2
3
4
3
1
2
3

取得 std::array 大小

使用 size() 函數來取得該 std::array 的大小,

std-array3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// g++ std-array3.cpp -o a.out
#include <iostream>
#include <array>

int main() {
std::array<int, 3> myArray;
std::array<double, 3> anotherArray = {1.1, 2.2, 3.3};

size_t size = myArray.size();
std::cout << size << "\n";

size_t size2 = anotherArray.size();
std::cout << size2 << "\n";

return 0;
}

輸出如下:

1
2
3
3

遍歷 std::array

你可以使用 for range 或迭代器來遍歷 std::array

std-array4.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// g++ std-array4.cpp -o a.out
#include <iostream>
#include <array>

int main() {
std::array<int, 3> myArray = {1, 2, 3};

for (const auto& element : myArray) {
// 使用 element
std::cout << element << "\n";
}

for (std::array<int, 3>::iterator it = myArray.begin(); it != myArray.end(); ++it) {
// 使用 *it
std::cout << *it << "\n";
}

return 0;
}

輸出如下:

1
2
3
4
5
6
1
2
3
1
2
3

修改元素

使用 [] 運算子可以修改該 std::array 的元素,

std-array5.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// g++ std-array5.cpp -o a.out
#include <iostream>
#include <array>

int main() {
std::array<int, 3> myArray = {1, 2, 3};

myArray[1] = 100; // 修改第二個元素

for (int i = 0; i < myArray.size(); i++) {
std::cout << myArray[i] << "\n";
}

return 0;
}

輸出如下:

1
2
3
1
100
3

檢查是否為空

使用 empty() 函數來檢查該 std::array 是否為空,

std-array6.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// g++ std-array6.cpp -o a.out
#include <iostream>
#include <array>

int main() {
std::array<int, 3> myArray = {1, 2, 3};
std::array<double, 3> anotherArray;

bool isEmpty = myArray.empty();
std::cout << isEmpty << "\n";

bool isEmpty2 = anotherArray.empty();
std::cout << isEmpty2 << "\n";

return 0;
}

輸出如下:

1
2
0
0

比較 std::array

你可以使用 ==!= 運算子來比較兩個 std::array 是否相等,

std-array7.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
// g++ std-array7.cpp -o a.out
#include <iostream>
#include <array>

int main() {
std::array<int, 3> myArray1 = {1, 2, 3};
std::array<int, 3> myArray2 = {1, 2, 3};
std::array<int, 3> myArray3 = {4, 5, 6};
std::array<int, 3> myArray4;

if (myArray1 == myArray2) {
std::cout << "與 myArray2 相等\n";
}

if (myArray1 == myArray3) {
std::cout << "與 myArray3 相等\n";
}

if (myArray1 == myArray4) {
std::cout << "與 myArray4 相等\n";
}

return 0;
}

輸出如下:

1
與 myArray2 相等

以上就是 C++ std::array 用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支援一下!

其它相關文章推薦
C/C++ 新手入門教學懶人包
std::string 用法與範例
std::vector 用法與範例
std::sort 用法與範例
std::map 用法與範例
std::set 用法與範例

C++ std::tuple 用法與範例

本篇 ShengYu 介紹 C++ std::tuple 用法與範例,C++ std::tuple 是一個用來存放不同資料類型的容器,該儲存空間可以透過 std::get 來進行存取,例如:對一個 tuple t 變數的話,可以用 get<i>(t) 取得該 tuple 裡各型別的變數,用 get<1>(t) 就取得第一個變數,用 get<2>(t) 就取得第二個變數,依此類推。通常 tuple 用於需要從函數回傳多不同資料類型的情況,接下來看看 std::tuple 用法範例。

要使用 std::tuple 的話,需要引入的標頭檔: <tuple>

C++ 建立 tuple

C++ 的 tuple 它可以容納不同類型的元素。以下是建立 tuple 的範例,

std-tuple.cpp
1
2
3
4
5
6
7
8
9
// g++ std-tuple.cpp -o a.out
#include <iostream>
#include <tuple>

int main() {
std::tuple<int, double, std::string> myTuple(100, 3.14, "hello world");

return 0;
}

取得 tuple 元素

C++ std::tuple 可以透過 std::get 來進行存取,範例如下,

std-tuple2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// g++ std-tuple2.cpp -o a.out
#include <iostream>
#include <tuple>

int main() {
std::tuple<int, double, std::string> myTuple(100, 3.14, "hello world");
std::cout << std::get<0>(myTuple) << "\n";
std::cout << std::get<1>(myTuple) << "\n";
std::cout << std::get<2>(myTuple) << "\n";

int value1 = std::get<0>(myTuple); // 取得第一個元素
double value2 = std::get<1>(myTuple); // 取得第二個元素
std::string value3 = std::get<2>(myTuple); // 取得第三個元素
std::cout << value1 << "\n";
std::cout << value2 << "\n";
std::cout << value3 << "\n";

return 0;
}

輸出如下,

1
2
3
4
5
6
100
3.14
hello world
100
3.14
hello world

您可以使用 std::get() 或在 C++17 及更高版本中使用結構化綁定來訪問 tuple 的元素,

1
2
3
4
5
6
7
8
std::tuple<int, double, std::string> myTuple(100, 3.14, "hello world");

// 使用結構化綁定(C++17及更高版本)
auto [a, b, c] = myTuple; // 自動將 tuple 中的元素綁定到變數 x, y, z

std::cout << a << "\n";
std::cout << b << "\n";
std::cout << c << "\n";

修改 tuple 元素

要修改 tuple 元素需要使用 std::get 的方式來進行修改,

std-tuple3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// g++ std-tuple3.cpp -o a.out
#include <iostream>
#include <tuple>

int main() {
std::tuple<int, double, std::string> myTuple(100, 3.14, "hello world");

std::get<0>(myTuple) = 123; // 修改第一個元素的值
std::get<1>(myTuple) = 5.43; // 修改第二個元素的值
std::get<2>(myTuple) = "world"; // 修改第三個元素的值

std::cout << std::get<0>(myTuple) << "\n";
std::cout << std::get<1>(myTuple) << "\n";
std::cout << std::get<2>(myTuple) << "\n";

return 0;
}

輸出如下,

1
2
3
123
5.43
world

解包 tuple 元素到變數

使用 std::tie 解包 std::tuple 到變數,

std-tuple4.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
// g++ std-tuple4.cpp -o a.out
#include <iostream>
#include <tuple>

int main() {
std::tuple<int, double, std::string> myTuple(100, 3.14, "hello world");
int a;
double b;
std::string c;
std::tie(a, b, c) = myTuple;

return 0;
}

同常使用情況為函式回傳 std::tuple 時,這樣可以直接用 std::tie 將變數接收 std::tuple 的元素值,要用 std::tie 的話也是同樣引用 tuple 的標頭檔 <tuple>

std-tuple5.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// g++ std-tuple5.cpp -o a.out
#include <iostream>
#include <tuple>

std::tuple<int, int, std::string> getStudent() {
return std::make_tuple(100, 18, "Tom");
}

int main() {
int id;
int age;
std::string name;
std::tie(id, age, name) = getStudent();

std::cout << "id: " << id
<< ", age: " << age
<< ", name: " << name << "\n";

return 0;
}

輸出如下:

1
id: 100, age: 18, name: Tom

取得 tuple 元素數量

你可以使用 std::tuple_size 來取得 tuple 的元素數量。

1
size_t tupleSize = std::tuple_size<decltype(myTuple)>::value;

詳細範例如下,

std-tuple6.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// g++ std-tuple6.cpp -o a.out
#include <iostream>
#include <tuple>

int main() {
std::tuple<int, double, std::string> t1;
std::tuple<int, double, std::string> t2(100, 3.14, "hello world");

size_t s1 = std::tuple_size<decltype(t1)>::value;
size_t s2 = std::tuple_size<decltype(t2)>::value;

std::cout << s1 << "\n";
std::cout << s2 << "\n";

return 0;
}

輸出如下:

1
2
3
3

使用 std::make_tuple 建立 tuple

std-tuple7.cpp
1
2
3
4
5
6
7
8
9
10
// g++ std-tuple7.cpp -o a.out
#include <iostream>
#include <tuple>

int main() {
std::tuple<int, double, std::string> myTuple(100, 3.14, "hello world");
auto anotherTuple = std::make_tuple(100, 3.14, "hello world");

return 0;
}

tuple 比較

如果 tuple 的元素類型支援比較,則 tuple 就可支援比較操作。您可以使用 ==!=<<=>>= 運算子來比較兩個 tuple,

std-tuple8.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
// g++ std-tuple8.cpp -o a.out
#include <iostream>
#include <tuple>

int main() {
std::tuple<int, double> tuple1 = std::make_tuple(100, 3.14);
std::tuple<int, double> tuple2 = std::make_tuple(100, 3.14);
std::tuple<int, double> tuple3 = std::make_tuple(100, 4.56);
std::tuple<int, double> tuple4;

if (tuple1 == tuple2) {
std::cout << "與 tuple2 相等\n";
} else {
std::cout << "與 tuple2 不相等\n";
}

if (tuple1 == tuple3) {
std::cout << "與 tuple3 相等\n";
} else {
std::cout << "與 tuple3 不相等\n";
}

if (tuple1 == tuple4) {
std::cout << "與 tuple4 相等\n";
} else {
std::cout << "與 tuple4 不相等\n";
}

return 0;
}

輸出如下:

1
2
3
與 tuple2 相等
與 tuple3 不相等
與 tuple4 不相等

以上就是 C++ std::tuple 用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
C/C++ 新手入門教學懶人包
std::string 用法與範例
std::vector 用法與範例
std::sort 用法與範例
std::map 用法與範例
std::set 用法與範例

Linux crontab 指令用法與範例

本篇介紹 Linux crontab 指令用法與範例,想要在 Linux 電腦中排程工作就可以使用 crontab,讓 Linux 系統定時地自動去執行指定的腳本或程式,詳細內容與範例如下,以下指令適用在 Ubuntu 或其它 Linux,

列出目前自己的 crontab 設定內容,

1
crontab -l

編輯 crontab 內容,

1
crontab -e

以下是 Ubuntu 下 crontab 的範例,

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
~/bin $ crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
*/5 * * * * /home/user/bin/xxx # 每隔 5 分鐘執行一次
59 23 * * * DISPLAY=:0 ~/crontab_script/xxx.sh # 23:59 時執行

其他參考
Linux 設定 crontab 例行性工作排程教學與範例
https://blog.gtwang.org/linux/linux-crontab-cron-job-tutorial-and-examples/

以上就是 Linux crontab 指令用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
Linux 常用指令教學懶人包

Linux shell script 產生隨機亂數指令用法範例

本篇介紹 Linux shell script 產生隨機亂數指令用法範例,只要在 command line 或 shell script 裡印出 $RANDOM 變數就可以了,範例如下,以下指令適用在 linux,也適用於 macOS,

在 shell 中印出 $RANDOM 變數的指令如下,$RANDOM 變數它是一個介於 0~32767 間的亂數,

1
$ echo $RANDOM

如果要 Linux shell 產生 0~99 之間的隨機亂數的話,可以改這樣,

1
$ echo $(($RANDOM % 100))

如果要 Linux shell 產生 0~100 之間的隨機亂數的話,可以改這樣,

1
$ echo $(($RANDOM % 101))

如果要 Linux shell 產生 1~100 之間的隨機亂數的話,可以改這樣,

1
$ echo $(($RANDOM % 100 + 1))

Linux shell 產生 3 位數的隨機亂數

當需要生成 3 位數的隨機整數時(不包含 0-99),你可以使用下列方式以確保結果在 100 到 999 的範圍內,這將產生一個在 100 到 999 之間的隨機 3 位整數。

1
$ echo $(($RANDOM % 900 + 100))

Linux shell 產生 32767 以上的亂數

如果要產生 32767 以上的亂數呢?如果你需要產生一個大於 32767 的隨機亂數,你可以使用 /dev/urandom/dev/urandom 這個裝置可以產生更大範圍的隨機亂數。你可以使用 dd 指令來從 /dev/urandom 讀取隨機資料,指令如下,

1
$ echo $(od -An -N2 -i /dev/urandom | awk '{print $1}')

Linux shell 產生 6 位數的隨機亂數

如果要產生 6 位數的隨機亂數呢?要產生一個6位數的隨機整數,你可以使用 shuf 指令來產生一個 6 位數的隨機整數,範圍從 100000 到 999999。你可以根據需要自訂範圍,確保它是一個6位數,範例如下,

1
$ echo $(shuf -i 100000-999999 -n 1)

在 shell script 中可以這樣寫,

1
2
random_number=$(shuf -i 100000-999999 -n 1)
echo $random_number

macOS 沒有 shuf 指令,可以改用 awk 的方式,但需要結合其他指令,如下範例,
這範例是使用 awk 來產生一個 6 位數的隨機整數,範圍從 100000 到 999999。你可以根據需要自訂 minmax 的值來產生不同範圍的隨機亂數。

1
$ awk -v min=100000 -v max=999999 'BEGIN{srand(); print int(min+rand()*(max-min+1))}'

以上就是 Linux shell script 產生隨機亂數指令用法範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
Linux 常用指令教學懶人包

C/C++ ncurses 用法與範例教學

本篇 ShengYu 會介紹如何在 C/C++ 使用 ncurses library ,同時簡單介紹 ncurses 範例程式,以及怎麼編譯 ncurses 程式。

ncurses(new curses)是一個程式函式庫,它提供了API 讓程式設計師編寫獨立於終端的基於文字的使用者介面 (TUI,text-based user interfaces),例如:編譯 linux 的 make menuconfig。

curses 是一個建構於 termcap/terminfo 之上的通用程式庫。而 ncurses 是 curses 的衍生改良版本。以下就來介紹這強大的 ncurses library 吧!

Read More

C/C++ snake 貪食蛇遊戲範例

本篇 ShengYu 介紹 C/C++ 用 SFML 函式庫寫 snake 貪食蛇遊戲,使用 SFML 函式庫寫遊戲的好處就是能夠讓你的遊戲跨平台運行,例如在 Windows / macOS / Linux 上執行,本篇的貪食蛇遊戲圖片是在 Ubuntu 執行,但也可以運行在 Windows / macOS 上,接下來就開始介紹怎麼寫 snake 貪食蛇遊戲。

Read More

C/C++ SFML 基本範例教學

本篇 ShengYu 介紹 C/C++ SFML 基本範例教學,SFML (Simple and Fase Media Library) 是由 C++ 寫成的跨平台遊戲、多媒體函式庫,可支援多種程式語言,SFML 分成幾大模塊:系統、視窗、圖形、音訊與網路。

簡單介紹 SFML 以下幾個模塊:
System:一些基礎建設,例如:向量(vector)、字串、thread、timer
Window:管理視窗以及輸入(鍵盤、滑鼠、搖桿等)及 OpenGL
Graphics:硬體加速的 2D 圖形,例如:sprite, text, shapes
Audio:音訊、錄音、3D音效
Network:TDP 與 UDP socket 與 HTTP 跟 FTP

Read More