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 用法與範例