C++中的std::pair和std::tuple如何使用?(代码示例)

std::pair适用于两个元素的组合,如键值对;std::tuple支持任意数量和类型的组合,适用于三及以上元素场景。二者均支持结构化绑定,但pair用.first/.second访问,tuple需std::get或tie解包。

std::pair 和 std::tuple 都是 C++ 标准库中用于组合多个值的轻量级容器,但适用场景不同:pair 专用于两个元素,tuple 更通用,支持任意数量、不同类型。

std::pair:固定两个元素的组合

常用于键值对(如 map 的 value_type)、函数返回多个结果、临时打包两个相关数据。

声明方式:std::pair,可通过 make_pair{} 初始化。

  • 访问成员用 .first.second
  • 支持比较操作(字典序)和结构化绑定(C++17 起)

示例:

立即学习“C++免费学习笔记(深入)”;

#include 
#include 
#include 

int main() { // 方式1:显式类型 + make_pair auto p1 = std::make_pair(42, "hello");

// 方式2:直接初始化(推荐,更简洁)
std::pair p2{100, "world"};

// 方式3:结构化绑定(C++17)
auto [num, msg] = p2;  // num = 100, msg = "world"
std::cout << num << ": " << msg << "\n";  // 输出:100: world

// 修改
p2.first = 999;
p2.second += "!";

}

std::tuple:任意数量、任意类型的组合

适合需要打包 3 个及以上值,或类型不统一的场景(比如函数返回状态码+结果+错误信息)。

声明方式:std::tuple,常用 std::make_tuple{} 构造。

  • 访问元素用 std::get(t)(按索引)或结构化绑定(推荐)
  • 支持 std::tie 解包到已有变量(常用于接收函数返回的 tuple)
  • 不能用 .first/.second,也不支持直接比较(需手动定义或用 std::tie 比较)

示例:

立即学习“C++免费学习笔记(深入)”;

#include 
#include 
#include 

// 模拟一个可能失败的计算函数 std::tuple compute(int x) { if (x < 0) return {false, 0, "negative input"}; return {true, x * x, "success"}; }

int main() { // 创建 tuple auto t = std::make_tuple(3.14, 'A', 42, std::string("ok"));

// 结构化绑定(C++17)
auto [pi, ch, n, s] = t;  // 类型自动推导
std::cout << pi << ", " << ch << ", " << n << ", " << s << "\n";

// 接收函数返回值并解包
bool ok;
int result;
std::string msg;
std::tie(ok, result, msg) = compute(-5);
std::cout << "Success: " << ok << ", Result: " << result << ", Msg: " << msg << "\n";

// 或直接用结构化绑定接收
auto [success, val, desc] = compute(7);
std::cout << "7² = " << val << " (" << desc << ")\n";

}

选择建议与注意事项

优先用 pair 当只有两个值且语义明确(如坐标、键值、成功/失败标志);用 tuple 当元素数 ≥3,或类型差异大、无通用命名习惯。

  • pair 是 tuple 的特化,性能几乎一致,但 pair 更语义清晰
  • tuple 元素类型必须在编译期确定,不能动态增删
  • 访问 tuple 元素时,索引越界(如 get(t) 但 t 只有 3 个元素)是编译错误
  • 若需命名字段,考虑自定义 struct,比 tuple 更可读、可维护

常见搭配技巧

pair 和 tuple 经常和标准算法、容器一起使用。

  • map 的迭代器解引用得到 pair
  • std::sort 支持 tuple/pair 的默认字典序比较,适合多级排序
  • 结合 std::apply 可将 tuple 元素作为参数调用函数

排序示例:

#include 
#include 
#include 

int main() { std::vector> data = { {2, "apple", 3.5}, {1, "banana", 2.1}, {2, "cherry", 1.9} };

// 默认按 first → second → third 字典序升序
std::sort(data.begin(), data.end());

// 自定义:先按 third 降序,再按 first 升序
std::sort(data.begin(), data.end(), [](const auto& a, const auto& b) {
    if (std::get<2>(a) != std::get<2>(b))
        return std::get<2>(a) > std::get<2>(b);
    return std::get<0>(a) < std::get<0>(b);
});

}