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

    文章

    8206

    浏览量

    141834
  • C++语言
    +关注

    关注

    0

    文章

    146

    浏览量

    6878
收藏 人收藏

    评论

    相关推荐

    C++函数virtual详解

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

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

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

    关于C++中的函数重载机制

    函数重载是C++的新增机制,是在同一个作用域中能声明定义多个同名字的函数.(我们知道函数的名字是函数
    发表于 10-01 17:18

    CC++中const的用法比较

    两行非法代码都是因为在定义数组长度时,必须在编译时确定常数值,但是因为对复杂的const对象会分配存储空间,所以编译时不能完全确定其值。在C++中,在函数外定义的const是文件作用域的,所以可以将
    发表于 11-11 10:00

    C++笔记003:C++从一个小程序开始

    这个先不用太过计较,后面会详细说明。调试程序,发现运行结果跟C语言是完全一样的!看来在C语言中使用的输出函数printf在C++中也是可以使用的!现在我把printf这行注释掉,因为
    发表于 03-05 12:51

    C++笔记008:C++命名空间 namespace的作用和使用解析

    定义了自己的命名空间就可以解决这个问题,即使重名,只要分属不同的命名空间就不会引起问题。在 C语言中定义了3个层次的作用域,即文件(编译单元)、函数和复合语句。C++又引入了类
    发表于 08-11 12:30

    C语言到C++的转变并不难!看完就懂了

    是一样的。所以不要担心语言的问题,现学都来的及。好了!话不多说,我们一起来看看怎么去过渡吧!1.CC++的区别C语言可以在C++编译器上完美运行,即
    发表于 08-12 15:54

    C++中的四种类型转换分别是哪些?C++中析构函数作用是什么

    C++中的四种类型转换分别是哪些?C++中析构函数作用是什么?在C语言中关键字static主要有何作用
    发表于 12-24 06:57

    C/C++回调函数

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

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

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

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

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

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

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

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

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

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

    std::array是C++容器库提供的一个固定大小数组的容器。其与内置的数组相比,是一种更安全、更容易使用的数组类型。
    的头像 发表于 07-19 11:02 595次阅读
    ​数组和<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 715次阅读