c++之 std::tie

本文介绍了C++11/14中新增的std::tie函数,探讨了它如何简化元组tuple的生成与数据解包,特别是在访问复杂集合类型时的便捷性。通过实例展示了如何创建tuple和使用std::tie进行高效数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

在c++ 11标准库中,加入了std::tie,在c++ 14中改进,方便使用。 其与tuple关系密切, 主要目的是方便地使用tuple。

元组 std::tuple

元组tuple,有人认为是std::pair扩展。pair只能把2个数据打包,而tuple可以打包更多的数据,虽然超过了9个时,其方式就比较搞笑了。

template<class _Ty1,
	class _Ty2>
	struct pair
	{	// store a pair of values
	typedef pair<_Ty1, _Ty2> _Myt;
	typedef _Ty1 first_type;
	typedef _Ty2 second_type;

	pair()
		: first(), second()
		{	// default construct
		}

	pair(const _Ty1& _Val1, const _Ty2& _Val2)
		: first(_Val1), second(_Val2)
		{	// construct from specified values
		}

	template<class _Other1,
		class _Other2,
		class = typename enable_if<is_convertible<const _Other1&, _Ty1>::value
			&& is_convertible<const _Other2&, _Ty2>::value,
			void>::type>
		pair(const pair<_Other1, _Other2>& _Right)
		: first(_Right.first), second(_Right.second)
		{	// construct from compatible pair
		}

//......

为生成pair, c++ 提供了make_pair的快捷操作。

而tuple的定义:


template<class _This,
	class... _Rest>
	class tuple<_This, _Rest...>
		: private tuple<_Rest...>
	{	// recursive tuple definition
public:
	typedef _This _This_type;
	typedef tuple<_This, _Rest...> _Myt;
	typedef tuple<_Rest...> _Mybase;
	static const size_t _Mysize = 1 + sizeof...(_Rest);

	tuple()
		: _Mybase(),
			_Myfirst()
		{	// construct default
		}

	template<class... _Rest2>
		explicit tuple(_Tuple_alloc_t, _Rest2&&... _Rest_arg)
			: _Mybase(_STD forward<_Rest2>(_Rest_arg)...),
				_Myfirst(allocator_arg)
		{	// construct smuggled allocator_arg_t element
		}

	template<class... _Other,
		class = typename _Tuple_enable<
			tuple<const _Other&...>, _Myt>::type>
		tuple(const tuple<_Other...>& _Right)
		: _Mybase(_Right._Get_rest()), _Myfirst(_Right._Myfirst._Val)
		{	// construct by copying same size tuple
		}
	// ....

相应地,c++ 标准库提供了make_tuple 内联方法,快速创建tuple对象。

std::tie

一般std::tie有2个作用:

  • 创建一个std::tuple;
  • 解包标准库中的一些集合类,简化访问方法。

生成tuple

使用极为简单,可以使用构造函数,内联快捷方法。
示例:

// 定义时 初始化
std::tuple<int, double, std::string> student1 = { 1, 98.0, "David" };
// 使用构造函数
std::tuple<int, double, std::string> student2 ( 2, 99.2, "david2" );

下面的示例使用内联快捷方法。 这里还使用了新版本c++支持的类型auto , 让编译器自动判断类型 – 虽然传统的我并不喜欢-- 编译时,编译器要选择至少支持C11版本. 如果使用VS,可以看到这些设置。

C-cimpiler version
在linux/macOS上,在g++ build时,指定std, 如:

g++ tuple_sample.cpp -o tuple_sample -std=c++11

代码示例:

auto student2 = std::make_tuple(11, 98, "Tom" );

使用std:tie,则也可以简单处理:

string name3 = "david3";
int id3 = 3;
double d3 = 99.3;
tuple<int, double, string>  student3 = std::tie(id3, d3, name3);

解包数据

使用std::tie 可以对一些集合类型进行解包,包括set, tuple, pair … 简化数据访问并赋值到变量。

如示例:

int id3;
string name3;
std::tie(id3, std::ignore, name3) = student3;
cout << "tie student-" << id3 << "  \t " << name3 << endl;

注意: 这里使用std:ignore跳过数据对象中不关心的数据。

输出:

tie student-3    david3
### C++ 中 `std::tie` 函数的用法 在 C++ 中,`std::tie` 是一个非常有用的工具函数,位于头文件 `<tuple>` 中。它允许我们将多个变量组合成一个元组 (tuple),从而可以一次性解构赋值或比较多个对象。 以下是关于 `std::tie` 的具体说明以及其常见用途: #### 基本概念 `std::tie` 将一组左值引用绑定到一个 tuple 对象中[^3]。这使得我们可以轻松实现多返回值的功能或者对多个变量进行统一操作。 #### 使用场景 1. **用于多重赋值** 当我们需要从某个函数获取多个返回值时,可以通过 `std::tie` 来接收这些值。 2. **用于比较两个结构体/类的对象** 如果我们希望基于多个成员变量来定义自定义排序规则,则可以用 `std::tie` 创建临时元组并调用标准库中的比较运算符。 3. **交换两个容器的内容而无需额外空间开销** 结合 `std::swap` 和 `std::tie` 可以高效完成这一任务。 #### 示例代码展示 下面提供几个典型的例子演示如何正确运用该功能: ```cpp #include <iostream> #include <tuple> // For std::tie and std::make_tuple #include <utility> // For std::move int main(){ int a=0, b=5; // Example of multiple assignment using std::tie. double d_val = 3.14; const char* c_str = "Example String"; std::tie(a, b) = std::make_tuple(10, 20); std::cout << "a=" << a << ", b="<<b<<"\n"; // Using std::ignore to discard certain values during unpacking. int x,y,z; std::tie(x,std::ignore,z)=std::make_tuple(7,-8,9); std::cout<<"x="<<x<<", z="<<z<<"\n"; // Comparisons based on tuples formed by std::tie. struct Point{ int x_,y_; bool operator<(const Point& rhs)const { return std::tie(x_,y_) < std::tie(rhs.x_,rhs.y_); } }; Point p1{1,2},p2{1,3}; if(p1<p2){ std::cout<<"Point p1 is less than point p2.\n"; } return 0; } ``` 上述程序展示了三种主要的应用方式:通过 `std::tie` 实现多变量的同时赋值;利用忽略机制处理不需要的数据项;还有借助于 `std::tie` 定义复杂的比较逻辑。 #### 注意事项 尽管 `std::tie` 非常强大且灵活,但在实际开发过程中需要注意以下几点: - 所有参与捆绑的变量都应该是非 const 类型的 lvalue 引用; - 若某一部分数据不关心的话,可采用 `std::ignore` 占位替代相应位置上的真实变量名; - 不要忘记包含必要的头文件 (`<tuple>`) 否则编译无法成功。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值