📅  最后修改于: 2023-12-03 15:20:20.913000             🧑  作者: Mango
在C++中,当需要从函数中返回多个值时,可以使用元组(tuple)和对(pair)。元组是一种通用的类模板,可以用来存储任意数量的对象,而对则是元组的一种特殊情况,仅包含两个对象。
在使用元组之前,需要包含头文件<tuple>
。元组的类型定义在名字空间std
中,因此需要加上命名空间限定符。
创建元组的语法非常简单,只需要使用一对圆括号即可。元组中可以存放不同类型的对象,例如:
std::tuple<int, double, std::string> my_tuple(42, 3.14, "hello");
可以使用std::get
函数访问元组中的元素,需要指定元素的索引:
int my_int = std::get<0>(my_tuple); // 42
double my_double = std::get<1>(my_tuple); // 3.14
std::string my_string = std::get<2>(my_tuple); // "hello"
也可以使用结构化绑定(structured binding)语法访问元组中的元素:
auto [my_int, my_double, my_string] = my_tuple;
元组是一个不可变的对象,不过可以通过拷贝和赋值创建一个新的元组。可以使用std::make_tuple
函数创建新的元组:
auto new_tuple = std::make_tuple(10, 20.0, "world");
也可以使用std::tuple_cat
函数将两个元组合并为一个新元组:
auto merged_tuple = std::tuple_cat(my_tuple, new_tuple);
对是元组的一种特殊情况,仅包含两个对象。
创建对的语法也非常简单,只需要使用一对花括号即可。例如:
std::pair<int, double> my_pair {42, 3.14};
也可以通过std::make_pair
函数创建对:
auto new_pair = std::make_pair(10, 20.0);
可以使用std::get
函数或结构化绑定语法访问对中的元素:
int my_int = std::get<0>(my_pair); // 42
double my_double = std::get<1>(my_pair); // 3.14
auto [my_int, my_double] = my_pair;
对也是不可变的对象,不过可以通过拷贝和赋值创建一个新的对。例如:
auto new_pair = my_pair;
new_pair.first = 10;
new_pair.second = 20.0;
在函数中返回元组或对可以用来返回多个值。例如,下面的函数返回一个对,包含两个整数:
std::pair<int, int> get_random_numbers() {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dist(1, 100);
return {dist(gen), dist(gen)};
}
int main() {
auto [a, b] = get_random_numbers();
std::cout << "a = " << a << ", b = " << b << std::endl;
}
另外一个例子,下面的函数返回一个元组,包含一个整数和一个字符串:
std::tuple<int, std::string> get_data() {
int my_int = 42;
std::string my_string = "hello";
return std::make_tuple(my_int, my_string);
}
int main() {
auto [num, str] = get_data();
std::cout << "num = " << num << ", str = " << str << std::endl;
}
使用元组和对可以方便地从函数中返回多个值。元组可以为任意类型的对象提供通用的容器,对则仅包含两个对象,更加简单直观。在使用元组和对时,需要注意它们是不可变的对象,只能通过拷贝和赋值创建新的元组或对。