0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++ std::tie函数的作用和用法

冬至子 来源:iDoitnow 作者:艰默 2023-07-18 17:28 次阅读

函数原型

C++中std::tie函数的作用就是从元素引用中生成一个tuple元组,其在头文件中定义,其函数原型如下:

template< class... Types >
std::tuple< Types&... > tie( Types&... args ) noexcept; //C++11起, C++14前

template< class... Types >
constexpr std::tuple< Types&... > tie( Types&... args ) noexcept;//C++14起

其中参数 args 为构造 tuple 所用的零或更多左值参数。其返回值为含的std::tuple对象。

作用和用法

1. 解包 tuple 和 pair

std::tie 可以用于解包 tuple 和 pair,因为 std::tuple 拥有从 pair 的转换赋值。

注:元组tuple可以将不同类型的元素存放在一起,可以理解为pair的扩展(pair只能包含两个元素,而tuple可以多个)。

std::tuple拥有从 pair 的转换赋值的主要原因就是:tuple的实现中重载了 operator=,其部分原型如下:

template< class U1, class U2 >
tuple& operator=( const std::pair< U1, U2 >& p );//C++11 起, C++20 前

因此,std::tie可以用于pair的解包:

std::set< int > set;
std::set< int >::iterator iter;
bool result;
std::tie(iter, result) = set.insert(value);//解包 insert 的返回值为 iter 与 result
std::tie(std::ignore, result) = set.insert(value);//使用std::ignore忽略insert的返回pair中的第一个元素

:std::ignore 是令 std::tie 在解包 std::tuple 时作为不使用的参数的占位符使用,即忽略某些 tuple 中的某些返回值。

2. 批量赋值

std::tie 可以将多个变量的引用整合成一个 tuple,进而通过另外一个同类型的 tuple 进行批量赋值。

tuple< string, double, int > tup("idoit", 98.8, 1);
string name;
double score;
int rank;

//通过变量tup实现对name、score、rank的批量赋值操作
tie(name, score, rank) = tup;

3. 比较结构体

可以将结构体成员传入std::tie,从而实现结构体的比较。

struct S {
    int n;
    std::string s;
    float d;
    bool operator< (const S& rhs) const
    {
        // 比较 n 与 rhs.n,
        // 然后为 s 与 rhs.s,
        // 然后为 d 与 rhs.d
        return std::tie(n, s, d) < std::tie(rhs.n, rhs.s, rhs.d);
        //注:由于tie返回的是一个 tuple,tuple的实现已经重载了operator< ,因此可以利用tuple的operator< ,进而实现结构体S的operator< 。
    }
};

具体示例

#include < iostream >
#include < set >
#include < string >
#include < tuple >
using namespace std;

struct S {
    int n;
    string s;
    float d;
    bool operator< (const S& rhs) const {
        // 比较 n 与 rhs.n,
        // 然后为 s 与 rhs.s,
        // 然后为 d 与 rhs.d
        return tie(n, s, d) < tie(rhs.n, rhs.s, rhs.d);
    }
};

int main() {
    set< S > set_of_s;

    S value1{42, "Test1", 3.14};
    S value2{23, "Test2", 3.14};
    set< S >::iterator iter;
    bool result;

    /************解包**********/
    tie(iter, result) = set_of_s.insert(value1);
    if (result) cout < < "Value1 was inserted successfullyn";

    tie(std::ignore, result) = set_of_s.insert(
        value2);  // 使用std::ignore忽略insert的返回pair中的第一个元素
    if (result) cout < < "Value2 was inserted successfullyn";

    /***********结构体比较**********/
    bool r = value1 < value2;
    cout < < "value1 < value2 : " < < r < < endl;

    /***********批量赋值**********/
    tuple< string, double, int > tup("idoit", 98.8, 1);
    string name;
    double score;
    int rank;

    tie(name, score, rank) = tup;
    cout < < name < < " " < < score < < " " < < rank < < endl;

    return 0;
}

输出结果:

Value1 was inserted successfully
Value2 was inserted successfully
value1 < value2 : 0
idoit 98.8 1
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 转换器
    +关注

    关注

    27

    文章

    8755

    浏览量

    148295
  • C++语言
    +关注

    关注

    0

    文章

    147

    浏览量

    7044
收藏 人收藏

    评论

    相关推荐

    C++函数virtual详解

    C++ 中的虚函数用于解决动态多态问题,虚函数作用是允许在派生类中重新定义与积累同名的函数,并且可以通过基类指针或引用来访问基类和派生类中
    发表于 09-07 11:27 2942次阅读

    c++中冒号(:)和双冒号(::)的用法

    ()——————————————————————————————————————VC中如下::是C++里的“作用域分解运算符”。比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类
    发表于 10-18 10:08

    C/C++回调函数

    C/C++回调函数首先看一下回调函数的官方解释:回调函数就是一个通过函数指针调用的
    发表于 02-11 15:25

    嵌入式-C++函数的重载

    一、什么是函数的重载 两个以上的函数,具有相同的函数名,通过参数的类型和参数的个数不同。编译器自行匹配,自动确定调用哪一个函数 二、函数重载
    发表于 06-28 13:54

    如何在中断C函数中调用C++

    之前,我们在单片机程序开发时都会面对中断函数。众所周知的,这个中断函数肯定是要用C函数来定义的。我在用C++进行程序开发的时候就发现了一个需
    发表于 05-09 18:17 0次下载
    如何在中断<b class='flag-5'>C</b><b class='flag-5'>函数</b>中调用<b class='flag-5'>C++</b>

    C语言和C++的特点与用法详细说明

    本文档的主要内容详细介绍的是C语言和C++的特点与用法详细说明。
    的头像 发表于 12-26 10:58 4494次阅读

    EE-128:C++中的DSP:从C++调用汇编类成员函数

    EE-128:C++中的DSP:从C++调用汇编类成员函数
    发表于 04-16 17:04 2次下载
    EE-128:<b class='flag-5'>C++</b>中的DSP:从<b class='flag-5'>C++</b>调用汇编类成员<b class='flag-5'>函数</b>

    C++中如何用虚函数实现多态

    01 — C++函数探索 C++是一门面向对象语言,在C++里运行时多态是由虚函数和纯虚函数
    的头像 发表于 09-29 14:18 1741次阅读

    C++ C语言函数查询电子版下载

    C++ C语言函数查询电子版下载
    发表于 01-18 10:15 0次下载

    深度解析C++中的虚函数

    函数作为C++的重要特性,让人又爱又怕,爱它功能强大,但又怕驾驭不好,让它反咬一口,今天我们用CPU的角度,撕掉语法的伪装,重新认识一下虚函数。 虚函数
    的头像 发表于 02-15 11:14 893次阅读
    深度解析<b class='flag-5'>C++</b>中的虚<b class='flag-5'>函数</b>

    C++中有函数指针还需要std::function嘛

    C/C++中可以使用指针指向一段代码,这个指针就叫函数指针,假设有这样一段代码:
    的头像 发表于 02-15 14:13 562次阅读
    <b class='flag-5'>C++</b>中有<b class='flag-5'>函数</b>指针还需要<b class='flag-5'>std</b>::function嘛

    C++基础知识之函数1

    函数C++ 中的一个重要概念,它可以让我们将一段代码封装起来,然后在需要的时候调用它。C++ 中的函数有以下几个特点: * 函数
    的头像 发表于 04-03 10:34 622次阅读

    ​数组和C++ std::array详解

    std::array是C++容器库提供的一个固定大小数组的容器。其与内置的数组相比,是一种更安全、更容易使用的数组类型。
    的头像 发表于 07-19 11:02 1187次阅读
    ​数组和<b class='flag-5'>C++</b> <b class='flag-5'>std</b>::array详解

    动态数组和C++ std::vector详解

    std::vector是C++的默认动态数组,其与array最大的区别在于vector的数组是动态的,即其大小可以在运行时更改。std::vector是封装动态数组的顺序容器,且该容器中元素的存取是连续的。
    的头像 发表于 07-19 11:07 1064次阅读

    ostream在c++中的用法

    ostream 是 C++ 标准库中一个非常重要的类,它位于 头文件中(实际上,更常见的是通过包含 头文件来间接包含 ,因为 包含了 和 )。 ostream 类及其派生类(如 std::cout
    的头像 发表于 09-20 15:11 1030次阅读