C++ 中的 std::pair 和 std::tuple

2023-05-16

C++ 中的 std::pair 和 std::tuple

最近在看 C++ 11 的标准,发现了 std::pair 和 std::tuple。 感觉这两个非常有用。就在这里记录一下。

std::pair 出现的比较早,最早是出现在 STL 中。定义在头文件 utility 中。
std::tuple 可以说是 std::pair 的增强版本。在 C++11 中引入的。定义在头文件 tuple 中。
简单的说 std::pair 可以将两个不同类型的数据绑定成一个对象。std::tuple 可以将 N 个不同的数据绑定成一个对象。这两个类都是模板类。在没有 std::pair 之前,为了将两个变量绑定在一起,我们只能定义一个结构体。用这个结构体来存放这两个数据。有了 std::pair 我们就可以省掉定义结构体这一步了。 std::tuple 也是一样。
下面是使用 std::pair 的几个简单的例子:

#include<utility>
std::pair <int, float> f;  //空构造
f = std::make_pair(10, 20.9);  //赋值
std::pair <int, float> f1(100,5.8);  //赋值构造
std::vector<std::pair <int, float>> arr;  //嵌套使用
int i = f.first; //返回第一个值
float a = f.second;  //返回第二个值

我个人认为 std::pair 和 std::tuple 最大的用途是用在函数返回值。我们知道 C++ 的函数只能返回一个值。如果我们要返回多个值,传统的办法是定义一个结构体。通过返回结构体的方法来返回多个值。或者就是利用函数的参数传指针或者引用,用函数参数来传出结果。这两种方法都没有 std::pair 或者 std::tuple 方便。

这里还要提到 std::tie() 函数,这个函数可以临时将几个变量绑定成一个 std::tuple。下面是个例子:

#include <tuple>
std::tuple<int, double> foo_tuple()
{
// return {1, -1}; // Error until N4387
// return std::tuple<int, int>{1, -1}; // Always works
 return std::make_tuple(1, -1); // Always works
}
std::pair<int , double > foo_pair()
{
    return std::make_pair(1, 2.0);
}

int main(int argc, char *argv[])

{
    int t1;
    double b1;
    std::tie(t1, b1) = foo_tuple();
    qDebug() << t1 << b1;
    std::tie(t1, b1) = foo_pair();
    qDebug() << t1 << b1;
}

从这个例子也能看出,std::pair 是一个特殊的 std::tuple。所以也可以用 std::tie。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中的 std::pair 和 std::tuple 的相关文章

  • 叮叮当当“你好,世界!” Windows 中的链接错误

    我刚刚下载了 CLang 源代码 使用 CMake 创建了 Visual C 10 IDE 工作区 并从 Visual C 10 0 express 构建了所有内容 现在我在 hello world 上收到一堆链接器错误 d dev tes
  • 是否有替换 C 风格 bool 数组的标准方法?

    在这段代码中 void legacyFunction int length bool bitset stuff lots of stuff int main int somenumber 6 somenumber is set to som
  • 使用前瞻的 C++ std::regex 失败

    我需要从磁盘解析 txt 文件 所以我首先做了一个例子来测试正则表达式 这是我的示例代码 std string txt paragraph r nthis is the text file r ni need only this data
  • 如何修复 C++ 中的“对 Array::Array(unsigned long) 的未定义引用”? [复制]

    这个问题在这里已经有答案了 我有一个用于对 char 数组进行排序的类 其中一个构造函数采用参数 size t 长度 当我向它传递 int 类型的长度并尝试编译时 出现错误 driver cpp text 0x2c 对 Array Arra
  • C++ std regex问号问题

    我在使用 std 正则表达式时遇到了麻烦 我无法使问号量词起作用 对 regex match 的调用将始终返回 0 我还尝试了 0 1 它的行为也不像我预期的那样 它的行为就像 量词 这是我的代码 include
  • C++ - 将 istream_iterator 与 wstringstream 结合使用

    我正在尝试向我编写的程序添加 Unicode 支持 我的 ASCII 代码已编译并包含以下几行 std stringstream stream abc std istream iterator
  • 我们可以依靠减少容量的技巧吗?

    它真的能保证以下减少容量的技巧在任何地方都能 起作用 吗 int main std string s lololololol s capacity still non zero string s swap s 它似乎对我来说 不起作用 因为
  • 根据插入时间从 std::map 中删除元素

    我需要根据插入时间 或其他比这更有效的方法 从 std map 中删除元素 该地图可能会包含数千个元素 如果我存储时间并迭代地图以检查每个元素的时间 那么最终可能会非常耗时 有谁知道如何在 std map 变老时删除它们 The std m
  • 修改 std::string::op[] 的结果合法吗?

    请考虑 C 11 中的以下内容 C 11 21 4 5 basic string元素访问 string access const reference operator size type pos const reference operat
  • 如果成功或失败,如何返回 std::copy 的值?

    我在用std copy将对象复制到std deque到一个文件 代码工作正常 但我需要检查复制是否成功 因此我需要设置标志 否则抛出异常 我已经用谷歌搜索但找不到解决方案如何检查是否std copy已成功将值复制到文件中 有人可以照亮它吗
  • 将 `std::copy()` 与 `std::back_inserter()` 一起使用

    我有两个 A 类和 B 类 都有一个如下所示的成员 class A std vector
  • 在 C++ 中检索 std::map 的随机关键元素

    如何在 C 中获取 std map 的随机密钥 使用迭代器 我不想维护额外的数据结构 std map迭代器是双向的 这意味着选择一个随机密钥将是O n 在不使用其他数据结构的情况下 基本上你唯一的选择就是使用std advance随机增量b
  • GCC 4.7.2:带有指向成员函数指针的 std::thread

    在编写测试代码时这个问题 https stackoverflow com questions 15080015 stdthread with pointer to data member我发现下面的注释行无法在 GCC 4 7 2 上编译
  • Xcode 找不到 cstddef

    由于某种原因 Xcode iOS 无法找到我正在使用的库 Boost 的 cstddef 有谁知道如何解决这一问题 我正在 Mac OS X 10 8 下使用 Xcode 4 6 进行编译 你应该让你的项目全部为 Objective C 将
  • 将 uint64_t 转换为 std::string

    如何将 uint64 t 值传输到 std string 我需要构造包含该值的 std string 例如这样的事情 void genString uint64 t val std string str some code for str
  • 使用accumulate计算数组double[]平均值的函数

    它一定是最常见的函数 每个人在某处都有代码片段 但我实际上花了不少于 1 5 小时在 SO 以及其他 C 网站上搜索它 但还没有找到解决方案 我想计算 a 的平均值double array 使用函数 我想将数组作为函数传递给参考 有数百万个
  • 错误 C2039:“find”:不是“std”的成员

    我刚刚遇到一个奇怪的错误 它说 find 不是 std 的成员 错误 C2039 find 不是 std 的成员 错误 C3861 查找 未找到标识符 基本上 我想查找是否可以在向量中找到字符串 知道为什么会发生这种情况吗 代码帮助告诉我
  • 如何从 C++ std::basic_ostream 派生并使 << 运算符虚拟?

    我正在编写一个具有各种消息输出的类 我想让这个类变得通用并且独立于平台 所以我正在考虑通过一个基本流引用它 它可以将所有消息转储到流中 通过这样做 如果该类在控制台程序中使用 我可以通过std cout并显示在控制台窗口中 或者我可以将派生
  • std::regex 的行为不一致

    我有以下问题 std regex如果我传递结果 行为会有所不同boost filesystem path string vs 将结果存储在中间字符串变量中 第一个将返回一个被截断的匹配 并且稍后不被接受std stoull 抛出 inval
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set

随机推荐

  • Ubuntu操作系统配置阿里云镜像方法一

    Ubuntu xff0c 是一款基于 Debian Linux 的以桌面应用为主的操作系统 xff0c 内容涵盖文字处理 电子邮件 软件开发工具和 Web 服务等 xff0c 可供用户免费下载 使用和分享 阿里云官方镜像站 xff1a ht
  • 关于在Ardusub-Raspberry镜像中ssh密码错误access denied问题

    环境 xff1a Win10 在此感谢论坛大佬的回答 xff0c 一下附上原网址 http rovmaker cn t topic 1272 在ArduSub入门教程 树莓派设置中 xff0c 本人按照上面的教程 xff0c 当完成相应步骤
  • O2OA中如何使用PostgreSQL + Citus 实现分布式数据库实现方案?

    虽然 O2OA 数据表高效的表结构以及索引的设计已经极大程度地保障了数据存取操作的性能 xff0c 但是随着使用时间从增长 xff0c 数据表存放的数据量也会急剧增长 此时 xff0c 仍然需要有合适的方案来解决数据量产生的系统性能瓶颈 本
  • 我的2013——学习、工作与生活

    一直觉得应该写阶段性总结 xff0c 以知道自己这段时间在干什么 xff0c 下一个阶段该干什么 xff0c 没实施过 xff1b 一直觉得学技术就应该多些博客 xff0c 以和同行共同学习交流 xff0c 分享是美德 xff0c 也是对
  • POI Excel导出样式设置

    HSSFSheet sheet 61 workbook createSheet 34 sheetName 34 创建sheet sheet setVerticallyCenter true 下面样式可作为导出左右分栏的表格模板 sheet
  • SQL强化:将相同的或连续的时间段合并

    问题描述 xff1a 有一张签到表 xff0c 需要将连续或相同的时间段合并 xff0c 即把多条记录查询合并成一条连续的时间段记录 数据表如下 xff1a DROP TABLE IF EXISTS 96 timesheets 96 CRE
  • Mysql实现数据的不重复写入(insert if not exists)以及新问题:ID自增不连续的解答

    最近做数据处理时候 xff0c 遇到一个问题 用一个id自增主键时候 xff0c 数据表中会插入大量重复数据 xff08 除ID不同 xff09 这虽然对最终数据处理结果没有影响 xff0c 但是有1个问题 xff0c 如果数据量超大 xf
  • 2014年秋找工作经历

    博主学渣一枚 xff0c 读研期间做过几个不上档次的管理系统 xff0c 学历不太好 xff0c 基础知识不太牢固 xff0c 所以校招找工作难免辛酸 记下这个过程 xff0c 以便日后回顾来时的路 9月 xff0c 酱油了 xff0c 只
  • 服务器端获取webservice客户端IP地址

    一 基于xfire发布的webservice获取客户端ip的方法 public String getClientIp String ip 61 34 34 try HttpServletRequest request 61 XFireSer
  • @Autowired,@Qualifier @Required @Resource @Component,@Service,@Controller,@Repository @PostConstruct

    1 64 Autowired 注解 xff1a 首先在使用时候需要引入配置 xff1a lt 该 BeanPostProcessor 将自动起作用 xff0c 对标注 64 Autowired 的 Bean 进行自动注入 gt lt bea
  • HTML中select标签单选多选详解

    select 元素可创建单选或多选菜单 当提交表单时 xff0c 浏览器会提交选定的项目 xff0c 或者收集用逗号分隔的多个选项 xff0c 将其合成一个单独的参数列表 xff0c 并且在将 lt select gt 表单数据提交给服务器
  • Centos7中语言如何设置成中文

    Centos系统作为开源最优秀的Linux版本 xff0c 我们在阿里云官方镜像站 xff1a https developer aliyun com mirror 找到所需Centos版本并下载安装后 xff0c 可能未注意指定系统语言 x
  • Tomcat正常启动,访问所有页面均报404异常,404异常总结

    今天遇到一个问题 xff1a Tomcat正常启动 xff0c 访问所有页面均报404异常 404异常 xff0c 很常见 xff0c 大多情况是路径错误 web xml文件映射路径写错 服务器设置 servlet的jar包未导进去或者没有
  • oracle中游标详细用法

    游标的概念 游标是SQL的一个内存工作区 xff0c 由系统或用户以变量的形式定义 游标的作用就是用于临时存储从数据库中提取的数据块 在某些情况下 xff0c 需要把数据从存放在磁盘的表中调到计算机内存中进行处理 xff0c 最后将处理结果
  • 连接2个字符串,strcat函数。

    题目描述 设计函数连接2个字符串 单个字符串的长度不超过100 不要使用系统提供的strcat函数 输入要求 输入2个字符串 xff0c 每个字符串以换行符结束 保证每个字符串中不会出现空格 输出要求 输出连接好的字符串 输入样例 Coun
  • git 下载指定历史版本

    1 选中想回退到的commit记录 xff0c 点击如图 2 选中Hard xff0c 表示该记录之后的改动全部丢弃 3 操作完之后代码会回滚到选中的位置 xff0c 这个时候不要拉取代码 xff0c 不然又拉回来了 xff1b 直接在现有
  • 摄像机内参、外参矩阵

    摄像机矩阵由P由内参矩阵和外参矩阵组成 xff0c 对摄像机矩阵进行QR分解可以得到内参矩阵和外参矩阵 在opencv的3D重建中 xff08 opencv中文网站中 xff1a 照相机定标与三维场景重建 xff09 xff0c 对摄像机的
  • 几个简单的数据点平滑处理算法

    最近在写一些数据处理的程序 经常需要对数据进行平滑处理 直接用FIR滤波器或IIR滤波器都有一个启动问题 xff0c 滤波完成后总要对数据掐头去尾 因此去找了些简单的数据平滑处理的方法 在一本老版本的 数学手册 中找到了几个基于最小二乘法的
  • 陶哲轩实分析 3.5 节习题试解

    3 5 1 第一种定义 xff1a x y 61
  • C++ 中的 std::pair 和 std::tuple

    C 43 43 中的 std pair 和 std tuple 最近在看 C 43 43 11 的标准 xff0c 发现了 std pair 和 std tuple 感觉这两个非常有用 就在这里记录一下 std pair 出现的比较早 xf