函数原型
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++中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.C和C++的区别C语言可以在C++编译器上完美运行,即
发表于 08-12 15:54
C++中的四种类型转换分别是哪些?C++中析构函数的作用是什么
C++中的四种类型转换分别是哪些?C++中析构函数的作用是什么?在C语言中关键字static主要有何作用
发表于 12-24 06:57
动态数组和C++ std::vector详解
std::vector是C++的默认动态数组,其与array最大的区别在于vector的数组是动态的,即其大小可以在运行时更改。std::vector是封装动态数组的顺序容器,且该容器中元素的存取是连续的。
评论