哈喽,大家好,我叫人宅,很高兴和大家一起分享一下元组教学。

元组的这个词在很多语言里面已经有涉及到,使用上非常简洁,tuple是泛化的std::pair,我们通常是把它当作一个结构体使用,比如我们可以将多个参数整合为一个结构体传递到函数内部,实现一些简洁的操作。

1.tuple创建与基础使用方式

tuple<int,float,int,float> tu = make_tuple(1,2.f,3,4.f);//创建方式一
tuple<int,float,int,float> tu(1,2.f,3,4.f);//创建方式二

//相当于结构体:
struct tu
{
int a;
float b;
int c;
float d;
}

以上的创建方式只是实参的拷贝,如果我们修改这些参数是无法真正修改实际的参数的值

当然我们还可以有直接修改参数的方式

int a = 0;
float b = .f;
int c = 0;
float d = .1;

auto tu = tie(a,b,c,d);

//本地进行修改
get<0> (tu) = 2;
get<1> (tu) = 4.5f;
get<2> (tu) = 234;
get<2> (tu) = 22.f;

//当然还可以这么用
auto tu1 = make_tuple(1,2.f,3,4.f);

除此之外我们还可以使用forward_as_tuple构造我们的元组 这种构造是可以直接使用参数的原始引用 。

注意:如果是值,无法赋值,因为地址不一样;

int a = 0;
float b = .f;
int c = 0;
float d = .1;

auto tu = forward_as_tuple(a,b,c,d);

get<0> (tu) = 2;
get<1> (tu) = 4.5f;
get<2> (tu) = 234;
get<2> (tu) = 22.f;

cout << a<< endl;
cout << b<< endl;
cout << c<< endl;
cout << d<< endl;

错误使用

auto tu = forward_as_tuple(1,2.f,3,4.f);

get<0> (tu) = 2;
get<1> (tu) = 4.5f;
get<2> (tu) = 234;
get<2> (tu) = 22.f;

//地址不一样

2.获取tuple的数量

tuple<int, int, int, int> a(2, 3, 1, 4);
size_t Num= tuple_size<decltype(a)>::value;
cout << "Num = " << Num<< endl;

3.获取tuple类型

tuple<int, int, int, int> a(2, 3, 1, 4);
tuple_element<1, decltype(a)>::type t = std::get<0>(a);
cout << "t = " << t << endl;

4.拼接元组

tuple<int, int, int, int> a(2, 3, 1, 4);
tuple<int, int, int, int> b(2, 3, 1, 4);
tuple<int, int, int, int> c(2, 3, 1, 4);

//拼接
auto TT = tuple_cat(a, b, c);

5.元组的简易实现原理

#include <iostream>
using namespace std;

template<typename... Values>
class Tuple;

template<>
class Tuple<>
{

};

template<typename TupleHead, typename... TupleTail>
class Tuple<TupleHead, TupleTail...> :private Tuple<TupleTail...>
{
using InheritedTuple = Tuple<TupleTail...>;
public:
Tuple()
{}

Tuple(TupleHead v, TupleTail... vtail)
:MyHead(v), InheritedTuple(vtail...)
{}

TupleHead Head() { return MyHead; }
InheritedTuple& Tail() { return *this; }
protected:
TupleHead MyHead;
};

int main()
{
Tuple<int, float, int > c (1, 5.f, 3);

system("pause");

return 0;
}

6.列印tuple全部的值

遍历tuple是非常麻烦的事情,以下提供了很好的遍历列印

#include <iostream>
#include <tuple>
#include <array>
#include <utility>
using namespace std;

template<class Tuple, size_t N>
struct PrintTuple
{
static void Printf(const Tuple& Value)
{
PrintTuple<Tuple, N - 1>::Printf(Value);
cout << "," << get<N - 1>(Value);
}
};

template<class Tuple>
struct PrintTuple<Tuple, 1>
{
static void Printf(const Tuple& Value)
{
cout << get<0>(Value);
}
};

template<class... Args>
void PrintfMyTuple(const tuple<Args...>& vlaue)
{
PrintTuple<decltype(vlaue), sizeof...(Args)>::Printf(vlaue);
}

int main()
{
tuple<int, int, int, int> a(2, 3, 1, 4);
PrintfMyTuple(a);
system("pause");

return 0;
}

以上是std C++ tuple用法,除此之外元组还可以比较。

7.作者其他教程地址

人宅:人宅系列教程?

zhuanlan.zhihu.com图标
推荐阅读:

相关文章